我有一个活动模型,他们属于一个位置
如何选择location.country = Australia的所有活动? (例如)
我可以在范围内执行此操作吗?
答案 0 :(得分:42)
使用最新的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" })
答案 1 :(得分:20)
您正在谈论的查询类型是加入。您可以在控制台中尝试这样的查询,如:
Activity.joins(:locations).where('locations.country = "Australia"')
这意味着SQL将获取与之关联的所有活动和位置,找到country = Australia的位置,然后返回与这些位置关联的活动。
要使其成为更可重复使用的范围,请在模型上使用国家/地区的变量对其进行定义:
scope :in_country, lambda {|country| joins(:locations).where('locations.country = ?',country)}
您可以在API docs中了解详情。
答案 2 :(得分:3)
是的,可以使用范围。这样的事情应该适用于活动模型:
scope :down_under,
joins(:locations).
where("locations.country = 'Australia')