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

Это вернет все случаи для клиента.