关于关系belongs_to的activerecord where子句

时间:2013-09-19 17:07:39

标签: ruby-on-rails ruby activerecord

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

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。我期望使用的查询就是这个。

Case.where(client.name => "Foo").first

它应该是什么?

2 个答案:

答案 0 :(得分:16)

Case.joins(:client).where(clients: { name: 'foo' })

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

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

  

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


注意复数/单数:

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

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


附加信息:

  • 您可以在where子句中使用值数组:

    Case.joins(:client).where(clients: { id: [1,2,5] })
    
  • .joins.includes之间的区别:Rails :include vs. :joins

答案 1 :(得分:1)

根据你正在做的事情,这样做可能更容易:

Client.where(:name => "foo").first.cases

这将返回客户端的所有案例。