簡體   English   中英

ActiveRecord 加入查詢並在 Rails 中選擇

[英]ActiveRecord Join Query and select in Rails

在我的 rails 4 應用程序中,一個客戶端(clients 表)可以有多個項目(projects 表)。 我在每個表中有一個名為name的列。 我正在嘗試編寫一個join ,然后select哪個使用項目作為基表和客戶端作為查找表。 client_idforeign_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM