Записи запросов через отношение own_to в Rails
У меня есть модель Activities, и они принадлежат к Местоположение
Как выбрать все действия, в которых location.country = Australia? (например)
Могу ли я сделать это в пределах области?
Ответы
Ответ 1
Вид запроса, о котором вы говорите, - это соединение. Вы можете попробовать такие запросы в консоли, как:
Activity.joins(:locations).where('locations.country = "Australia"')
Это означает, что SQL будет принимать все действия и местоположения, связанные с ним, найти местоположения, в которых находится страна = Австралия, а затем вернуть вам действия, связанные с этими местоположениями.
Чтобы сделать это более пригодным для повторного использования, определите его в своей модели с переменной для страны:
scope :in_country, lambda {|country| joins(:locations).where('locations.country = ?',country)}
Подробнее об этом можно узнать в API-документах.
Ответ 2
С последними версиями рельсов вы можете:
Activity.joins(:location).where(locations: { country: "Australia" })
Осторожно:
- местоположение является единственным в joins (: location), потому что оно принадлежит отношению к
- местоположения во множественном числе, потому что это имя таблицы
Последнее означает, что если у вас было следующее:
belongs_to :location, class_name: "PublicLocation"
запрос будет выглядеть следующим образом:
Activity.joins(:location).where(public_locations: { country: "Australia" })
Ответ 3
Да, можно использовать область. Что-то вроде этого должно работать над моделью Activities:
scope :down_under,
joins(:locations).
includes(:locations).
where("locations.country = 'Australia')