关于关系belongs_to的activerecord where子句

rak*_*tin 12 ruby activerecord ruby-on-rails

我在sql中并不强大,而且对rails来说相对较新.该

Case
  attr_accessible client_id
  belongs_to Client

Client
  attr_accessibe name
  has_many Cases
Run Code Online (Sandbox Code Playgroud)

我可以通过client_id直接查询并按预期获得记录

Case.where(client_id: 1)
Run Code Online (Sandbox Code Playgroud)

但我想通过client.name查询

Case.where(client.name => "Foo")
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,告诉我客户端不是一个案例的方法.

Undefined method or local variable 
Run Code Online (Sandbox Code Playgroud)

最终,我要做的事情非常简单:获得属于客户端"Foo"的第一个Case.我希望使用的查询就是这个.

Case.where(client.name => "Foo").first
Run Code Online (Sandbox Code Playgroud)

它应该是什么?

MrY*_*iji 18

Case.joins(:client).where(clients: { name: 'foo' })
Run Code Online (Sandbox Code Playgroud)

此查询将连接案例表上的客户端(删除没有任何客户端关联的案例)并添加where子句 "where clients.name = 'foo'"

在人类语言中,此查询执行:

获取至少一个客户端名称与" foo " 严格相等(区分大小写)的案例


注意复数/单数:

  • 在联接/包含中,使用与模型中声明的关系相同的名称

  • 在where子句中,始终使用关系的复数形式(实际上是表的名称)


附加信息:

  • 复数/单数问题实际上是关于两个完全独立的事物.`joins` /`includes`引用_how你的关联是在Rails_中调用的(这里是``client`),而在`where`中你引用_db表和db columns_(这里的表叫做`clients`).将它们命名为相同的惯例/便利. (2认同)