如何根据 has_many :through 关系的属性找到 Rails 对象?

发布于 2024-11-15 09:00:11 字数 618 浏览 3 评论 0原文

模型:Foo、Bar、Bonk

class Foo < ActiveRecord::Base
  has_many :bars
  has_many :bonks, :through => :bars
end

class Bar < ActiveRecord::Base
  has_many :bonks
end

我如何检索与名称为“awesome”的 Bonk 关联的 Foo 对象列表

我知道如何使用 Foo.find(... ) 涉及一个 :join 和一个 :condition。不过,我想做的是避免将那么多原始 sql 塞入其中(特别是当中间有多个模型时)。

显然,类似的东西

Foo.find(:all, :conditions=>["bonks.name = ?", 'awesome'])

不会像它生成的那样工作。

Select * from foos where bonks.name = 'awesome'

遗憾的是,我在这里处理的是 Rails 1.2 应用程序,但我不认为此功能从那时起就发生了变化。

Models: Foo, Bar, Bonk

class Foo < ActiveRecord::Base
  has_many :bars
  has_many :bonks, :through => :bars
end

class Bar < ActiveRecord::Base
  has_many :bonks
end

How can I retrieve a list of Foo objects that are associated with a Bonk whose name is "awesome"

I know how to do with with a Foo.find(...) that involves a :join and a :condition. What I want to do though is avoid shoving that much raw sql into there (especially when there's more than one model in the middle).

Something like

Foo.find(:all, :conditions=>["bonks.name = ?", 'awesome'])

which, obviously, doesn't work as it'd generate

Select * from foos where bonks.name = 'awesome'

Sadly, I'm dealing with a rails 1.2 app here but I don't think this functionality has changed since then.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

卷耳 2024-11-22 09:00:11
Foo.find(:all, :conditions=>["bonks.name = ?", 'awesome'], :include => :bonks)

应该生成类似的东西

Select * from foos, bars, bonks where bars.foo_id = foo.id and bonks.bar_id = bar.id and bonks.name = 'awesome'
Foo.find(:all, :conditions=>["bonks.name = ?", 'awesome'], :include => :bonks)

should generate something along the lines of

Select * from foos, bars, bonks where bars.foo_id = foo.id and bonks.bar_id = bar.id and bonks.name = 'awesome'
浪漫之都 2024-11-22 09:00:11

在 1.2 中 - :joins 参数中的 SQL 片段是您的最佳选择。没有更好的方法可以做到这一点。

In 1.2 - an SQL fragment in a :joins argument is your best choice here. There's no better way to do this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文