Activerecord где clause on relation принадлежит_to
Я не сильный в sql и относительно новый для рельсов.
Case
attr_accessible client_id
belongs_to Client
Client
attr_accessibe name
has_many Cases
Я могу напрямую запросить client_id и вернуть запись как ожидалось
Case.where(client_id: 1)
Но я хотел бы запросить client.name
Case.where(client.name => "Foo")
Это дает мне ошибку, которая говорит мне, что клиент не является методом случая.
Undefined method or local variable
В конечном счете то, что я пытаюсь сделать, очень просто: получите первый случай, который принадлежит клиенту "Foo". Я хотел бы использовать этот запрос.
Case.where(client.name => "Foo").first
Что это должно быть?
Ответы
Ответ 1
Case.joins(:client).where(clients: { name: 'foo' })
Этот запрос соединяет клиентов в таблице case (исключает случаи без привязки к клиенту) и добавляет предложение where "where clients.name = 'foo'"
В человеческом языке этот запрос выполняет:
Получите Случаи, имеющие хотя бы одного Клиента с именем строго равным (с учетом регистра) значением 'foo'
Обратите внимание на множественное число/единственное:
-
в объединениях/включает в себя то же имя, что и отношение, объявленное в модели
-
в предложении where всегда используйте множественную версию отношения (фактически имя таблицы)
Дополнительная информация:
-
Вы можете использовать массив значений в предложении where:
Case.joins(:client).where(clients: { id: [1,2,5] })
-
Разница между .joins
и .includes
: Rails: include vs.: join
Ответ 2
В зависимости от того, что вы делаете, может быть проще сделать это следующим образом:
Client.where(:name => "foo").first.cases
Это вернет все случаи для клиента.