在 Rails 中通过其 belongs_to 关系查询记录

Posted

技术标签:

【中文标题】在 Rails 中通过其 belongs_to 关系查询记录【英文标题】:Query records through its belongs_to relation in Rails 【发布时间】:2012-12-16 11:17:10 【问题描述】:

我有一个活动模型,它们属于一个位置

如何选择所有 location.country = 澳大利亚的活动? (例如)

我可以在一个范围内这样做吗?

【问题讨论】:

【参考方案1】:

使用最新的 Rails 版本,您可以:

Activity.joins(:location).where(locations:  country: "Australia" )

小心:

它是joins(:location) 中的位置(单数),因为它引用了belongs_to 关系名称 它是where(…) 中的位置(复数),因为它引用了表名

后者意味着如果你有以下情况:

belongs_to :location, class_name: "PublicLocation"

查询将是:

 Activity.joins(:location).where(public_locations:  country: "Australia" )

【讨论】:

关于 belongs_to 与表名的单数与复数命名的澄清为我清除了它。谢谢!【参考方案2】:

是的,可以使用范围。像这样的东西应该适用于活动模型:

scope :down_under, 
    joins(:locations).
    where("locations.country = 'Australia')

【讨论】:

您不需要连接和包含来运行此查询。如果他只是加载活动,则无需在查询中包含所有位置。 好点 - 包含不是绝对必要的。但是,如果他确实需要位置对象,他可以为自己节省往返数据库的时间。 谢谢。包括避免 n+1 注明。【参考方案3】:

您所说的查询类型是联接。您可以在控制台中尝试这样的查询:

Activity.joins(:locations).where('locations.country = "Australia"')

这意味着 SQL 将获取与 then 相关联的所有活动和位置,找到 country=Australia 的位置,然后返回与这些位置相关联的活动。

要使其成为更可重用的范围,请在您的模型上使用国家/地区变量定义它:

scope :in_country, lambda |country| joins(:locations).where('locations.country = ?',country)

您可以在API docs 中了解更多信息。

【讨论】:

好的,谢谢。我没有意识到在进行查询之前我必须指定连接。冒着lmgtfy的风险,文档在哪里?我环顾四周并没有找到任何好的资源,一定是遗漏了一些明显的东西。 顺便说一句,我添加了一个编辑以将传递给 lambda 的变量与内部使用的国家/地区变量相匹配 太好了,感谢您的编辑。另外,请注意其他答案,该答案表明您是否要使用位置对象,您也可以将其包括在内。最后回复:文档,这是 SQL,而不是 Rails。因此,很难为这种特定于 Rails 的 SQL 用法找到简单的“how-to”文档,但任何 SQL 教程/参考资料都可能会有所帮助。 IMO 学习使用 SQL 是掌握 Rails 中最难的部分。祝你好运! 我很惊讶这能起作用,因为:location 是复数,而且这种关系似乎不存在

以上是关于在 Rails 中通过其 belongs_to 关系查询记录的主要内容,如果未能解决你的问题,请参考以下文章

在python的List中通过其成员查找对象

在python中通过其相似性进行图像聚类

如何在C ++中通过其名称获取进程句柄?

如何使用python在selenium中通过其id名称的一部分查找元素

如何使用存储库接口在 Spring Data 中通过其嵌套对象的 objectId 查找集合?

Rails 3 中的Belongs_to 关联缓慢