将自定义连接与常规轨道连接组合在一起

时间:2011-04-07 02:17:59

标签: ruby-on-rails ruby activerecord rails-activerecord

我有模特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

中得到解决

1 个答案:

答案 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查询,其中,限制等。