2011-06-03 41 views
0

我有一个简单的问题 - 基本上我想获取某些符合某些条件的模型X的所有ActiveRecords。我想在这里使用X.where方法,但我不确定它将如何工作。基本上,我的模型X has_many Y.ruby​​ on rails使用where子句获取activerecords

我有一个模型Y对象的ID列表。我想找到所有在其has_many Y中至少有一个这样的ID的模型X.

有没有一种简单的方法可以使用X.where做到这一点?或者我需要更复杂的SQL?

回答

0

这里是我会做什么:

Modelx.joins(:modelys).where(:modelys => { :id => list_of_ids }).all 

另一种解决方案,我宁愿是使用范围:

def Modelx < ActiveRecord::Base 
    has_many :modelys 
    has_many :modelzs 

    scope :has_modely_ids, lambda { |ids| joins(:modelys).where(:modelys => { :id => [*ids] }) } 
    scope :has_modelz_ids, lambda { |ids| joins(:modelzs).where(:modelzs => { :id => [*ids] }) } 

end 

,那么你可以做的东西,如:

Modelx.has_modely_ids(y_ids).all 
Modelx.has_modelz_ids(z_ids).all 

modelx_with_ys = Modelx.has_modely_ids(y_ids) 
modelx_with_zs = Modelz.has_modely_ids(y_ids) 

或链接:(只记得打电话时,你实际上想要运行查询)

modelx_with_y_and_zs = Modelx.has_modely_ids(y_ids).has_modelz_ids(z_ids) 
modelx_with_y_and_zs = modelx_with_ys.has_modelz_ids(z_ids) 
+0

这样可以有效地满足多种条件吗?说X has_many Z.我也有一个Z的id列表。我想找到X s.t.它在Y id列表中有一个带有id的Y,在Z id列表中带有id。将Modelx.joins(:modelys).joins(:modelzs).where(:modelys => {:id => list_of_y_ids},:modelzs => {:id => list_of_z_ids})工作,如果是这样,是不是最有效的方法? – deruse 2011-06-03 04:06:14

+0

我添加了一些使用范围的例子。我发现它可以很好地扩展,但根据你的情况,总会有改进的空间。 – natedavisolds 2011-06-03 04:24:54

+0

如何查询交叉路口?例如,如果我想要Modelx具有Y id'a'和'b'。以上将给我Modelx的'a'或'b'。我需要执行Modelx.has_modely_ids(a).has_modely_ids(b)来获得交集。这似乎并没有与更多的标准规模。有没有更好的方法来处理这个用例?谢谢! – deruse 2011-06-03 16:39:17