15

我不擅长 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.where(client.name => "Foo").first

应该是什么?

4

2 回答 2

24
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和之间的区别.includesRails :include 与 :joins

于 2013-09-19T17:18:13.033 回答
1

根据您正在做的事情,以这种方式进行可能会更容易:

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

这将为客户返回所有案例。

于 2013-09-19T17:18:41.173 回答