[英]ActiveRecord Join Query and select in Rails
在我的 rails 4 應用程序中,一個客戶端(clients 表)可以有多個項目(projects 表)。 我在每個表中有一個名為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 id: 1, name: "Fantastico Client">]>
如果我嘗試這樣別名:
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 [#<Project id: 1, name: "The Dream Project">]>
無論哪種情況,ActiveRecord 都會丟失其中一個名稱,正如您從上面的響應中看到的那樣。 我應該如何編寫此查詢?
如果select
的列不是調用select
的模型的屬性之一,則不會顯示這些列。 所有這些屬性仍然包含在AR::Relation
中的對象中,並且可以像任何其他公共實例屬性一樣訪問。
您可以通過調用first.client_name
來驗證這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"
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')
那么它看起來像 [#, #]
但它包含您選擇的所有屬性。
要同時獲取項目表名稱和客戶端名稱,您可以執行以下查詢
Project.joins(:client).pluck(:name,:'clients.name')
嘗試這個:
sql = Project.joins(:client).select(:id, :name, :"clients.name AS client_name").to_sql
data = ActiveRecord::Base.connection.exec_query(sql)
輸出
[
{"id"=>1, "name"=>"ProjectName1", "client_name"=>"ClientName1"},
{"id"=>2, "name"=>"ProjectName2", "client_name"=>"ClientName2"}
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.