gpt4 book ai didi

ruby-on-rails - 将自定义连接与常规 Rails 连接相结合

转载 作者:太空宇宙 更新时间:2023-11-03 16:10:11 25 4
gpt4 key购买 nike

我有这样的模型 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 被包装在哈希中并且第一个 :joins 丢失了。

当然,我总是可以将两者组合成一个 :joins 字符串。但是,这两个调用如何结合尽可能少的原始sql呢?有什么想法吗?

编辑:接受的答案确实回答了我的问题,但我仍然认为可能有更好的方法。

编辑 2:正如 ruby​​prince 提到的,这已在 rails >= 3.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

然后你就可以在controller中这样调用了

Foo.joined_bars.joined_baz

您可以像这样将任何条件或其他参数附加到所选对象

Foo.joined_bars.joined_baz.all(:conditions => ..,
:limit => ..)

这将创建一个包含所有连接、where、limit 等的 SQL 查询

关于ruby-on-rails - 将自定义连接与常规 Rails 连接相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com