ActiveRecord加入查询并在Rails中选择

在我的rails 4应用程序中,客户端(客户端表)可以有许多项目(项目表)。 我在每个表中都有一个名为name的列。 我正在尝试编写join ,然后select将项目用作基表,将客户端用作查找表。 client_id是项目表中的foreign_key

我写的查询如下:

 Project.joins(:client).select('projects.id,projects.name,clients.name') 

我收到以下回复:

 Project Load (0.6ms) SELECT projects.id,projects.name,clients.name FROM "projects" INNER JOIN "clients" ON "clients"."id" = "projects"."client_id" => #<ActiveRecord::Relation [#]> 

如果我尝试别名就像这样:

 Project.joins(:client).select('projects.id,projects.name,clients.name as client_name') 

然后我得到以下回复:

 Project Load (0.8ms) SELECT projects.id,projects.name,clients.name as client_name FROM "projects" INNER JOIN "clients" ON "clients"."id" = "projects"."client_id" => #<ActiveRecord::Relation [#]> 

在任何一种情况下,ActiveRecord都会丢失其中一个名称,您可以从上面的响应中看到。 我该怎么写这个查询?

如果select的列不是调用select的模型的属性之一,则不显示这些列。 所有这些属性仍包含在AR::Relation中的对象中,并且可以作为任何其他公共实例属性访问。

您可以通过调用first.client_name来validation这first.client_name

 Project.joins(:client) .select('projects.id,projects.name,clients.name as client_name') .first.client_name 

您可以使用:'clients.name'作为您的符号之一。 例如:

Project.select(:id, :name, :'clients.name').joins(:client)

我更喜欢它,因为它看起来像Rails理解它,因为它引用了所有参数:

SELECT "projects"."id","projects"."name","clients"."name" as "client_name" FROM "projects" INNER JOIN "clients" ON "clients"."id" = "projects"."client_id"

(我不是100%确定这是确切的SQL查询,但我相当肯定,我保证使用"clients"."name"

你的查询不会丢失任何东西。 实际上你已经在模型上应用了连接,并且你已经编写了Project.joins(:client),看它是什么样子。 表示它将按原样保存项目相关数据,并将关联数据保存为您在查询中提供“client_name”的别名。

如果你使用

 Project.joins(:client) .select('projects.id project_id, projects.name projects_name,clients.name as client_name') 

那看起来像[#,#]

但它包含您选择的所有属性。