2014-11-21 55 views
0

我从两个模型加载数据,一旦数据加载到变量中,那么我需要从第一个关系中删除那些不在第二个中的项目。如何从关系中删除某些项目?

样本:

users = User.all 
articles = Articles.order('created_at DESC').limit(100) 

我有这两个变量充满了关系数据。现在我需要从articles中删除所有项目,其中user_id值不包含在users对象中。因此在articles将只保留user_id的项目,即变量users

我尝试了一个循环,但它非常缓慢。我如何有效地做到这一点?

编辑:

我知道有一种方法,以避免建设一个更好的查询这样做,但对我来说,我不能这样做,(虽然我同意,在上面的例子中有可能做到这一点)。那是因为我有两个变量从数据库加载数据,我需要用Ruby来处理它们。有这样的命令吗? 谢谢

回答

0

这样做的最好方法可能是用SQL连接。这会工作吗?

Articles.joins(:user).order('created_at DESC').limit(100) 
+0

感谢@JoshBodah,我知道有办法建立一个更好的查询,但我已经有了变量中的数据并需要处理它们(我更新了OP)。 – user984621 2014-11-22 11:52:13

+0

我认为问题在于迭代集合并执行'.include?'检查的幼稚解决方案由于'users'的大小太慢了。你有的其他选择是1)用'id'对'User.all'进行排序并使用二进制搜索(Array#bsearch)2)使用集合来找到交集3)在迭代时插入一个Hash来记忆你的工作(例如遍历文章并检查hash中的user_id是否在散列中缓存每个用户时搜索用户)。二进制搜索的方法是可以的(Set也可以),但哈希方式可能会很慢 – 2014-11-22 15:31:23

1

假设你对Article模型belongs_to关系:

articles.where.not(users: users) 

这将使你顶多100,但可能更少。如果你想与条件返回100(我没有测试过,但这个想法是一样的,把用户的条件在WHERE语句):

Articles.includes(:users).where.not(users: true).order('created_at DESC').limit(100) 
+0

感谢@ nikkon226,我知道有一种方法可以构建一个更好的查询,但我已经有了变量中的数据并需要处理他们(我更新OP)。 – user984621 2014-11-22 11:51:48

+0

第一个代码不工作吗? – nikkon226 2014-11-22 13:42:18

相关问题