26

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

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

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

4

3 回答 3

65

使用最新的 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" })
于 2015-10-21T18:25:26.087 回答
22

您正在谈论的查询类型是联接。您可以在控制台中尝试这样的查询,例如:

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

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

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

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

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

于 2013-01-02T02:37:07.377 回答
3

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

scope :down_under, 
    joins(:locations).
    where("locations.country = 'Australia')
于 2013-01-02T02:27:40.467 回答