У меня есть модель действий, и они принадлежат местоположению
Как выбрать все виды деятельности, у которых location.country = Australia? (Например)
Могу ли я сделать это в рамках области?
У меня есть модель действий, и они принадлежат местоположению
Как выбрать все виды деятельности, у которых location.country = Australia? (Например)
Могу ли я сделать это в рамках области?
С последними версиями рельсов вы можете:
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" })
Тип запроса, о котором вы говорите, - это соединение. Вы можете попробовать такие запросы в консоли, например:
Activity.joins(:locations).where('locations.country = "Australia"')
Это означает, что SQL возьмет все действия и местоположения, связанные с этим, найдет местоположения, где страна = Австралия, а затем вернет вам действия, связанные с этими местоположениями.
Чтобы сделать это более пригодным для повторного использования, определите его в своей модели с помощью переменной для страны:
scope :in_country, lambda {|country| joins(:locations).where('locations.country = ?',country)}
Подробнее об этом можно узнать в документах по API.
:location
во множественном числе, и кажется, что эта связь не существует.
- person Jeremy Thomas; 08.12.2016
Да, прицел можно использовать. Что-то вроде этого должно работать в модели Activity:
scope :down_under,
joins(:locations).
where("locations.country = 'Australia')