我有模特foo,bar和baz就像这样
# has a field join_condition_string
class Foo < AR::Base
:has_many :bar
end
# Has a field exclusion_critera
class Bar < AR::Base
:belongs_to foo
end
# has a fields condition_string, exclusion_criteria
class Baz < AR::Base
end
我希望能够根据Bar和Baz的标准检索Foo。因此我需要加入这两个模型。我想使用rails magic加入Bar,
Foo.find(:all, :joins => :bar)
我想使用自定义联接加入Baz。
Foo.find(:all, :joins=>"left join baz on baz.condition_string = foo.join_condition_string")
这些工作非常独立,但我似乎找不到优雅地结合它们的方法。
我试图做一些天真的事情并将两个条件组合在一个数组中,但无济于事。
Foo.find(:all, :joins=>["left join baz ...", :bar])
docs声称我可以Foo.find(:all, :joins => :bar, :joins => "left join baz ...")
,但这似乎不应该有用(并且它不在rails 2.3.8中),因为要查找的args被包装在哈希和第一个:连接丢失。
当然,我总是可以将两者合并为一个:连接字符串。但是,如何将这两个调用与尽可能少的原始sql相结合?有什么想法吗?
编辑:接受的答案确实回答了我的问题,但我仍然认为可能有更好的方法。
编辑2:正如rubyprince所提到的,这已在rails&gt; = 3.0.0
中得到解决答案 0 :(得分:2)
这可能是解决您的问题的方法。您可以将这些连接分别保留为模型中的两个命名范围,并像这样调用它们。
class Foo < AR::Base
has_many :bars
named_scope :joined_bars, :joins => :bars
named_scope :joined_baz, :joins => "LEFT JOIN baz on ..."
end
然后你可以像这样在控制器中调用它
Foo.joined_bars.joined_baz
您可以将任何条件或其他参数附加到所选的
Foo.joined_bars.joined_baz.all(:conditions => ..,
:limit => ..)
这将创建一个包含所有连接的SQL查询,其中,限制等。