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')
那看起来像[#,#]
但它包含您选择的所有属性。