【发布时间】:2011-04-07 02:17:58
【问题描述】:
我有这样的模型 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 魔法加入 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 被包裹在一个散列中并且第一个 :joins 丢失了。
当然,我总是可以将两者组合成一个 :joins 字符串。但是,如何将这两个调用与尽可能少的原始 sql 结合起来呢?有什么想法吗?
编辑:接受的答案确实回答了我的问题,但我仍然认为可能有更好的方法。
编辑 2:正如 rubyprince 所说,这已在 rails >= 3.0.0 中解决
【问题讨论】:
-
你试过这个
Foo.find(:all, :joins=>[:bar, "left join baz ..."])吗?我的意思是数组倒序...
标签: ruby-on-rails ruby activerecord rails-activerecord