想要達到
紅寶石 2.6.5 導軌 6.0.3
感謝您的關注。我正在使用 Rails 創建一個 Web 應用程式。
我想知道如何從多個表中只提取我想要的列的資料,將它們放入一個陣列中,然后使用每個輸出它們。
細節
我想從下表中提取相關的users.name、company.company_name 和tasks.task_name,并將它們作為一個單元放入一個陣列中。我想輸出我們以這種方式創建的陣列,一次一個,在 erb 中使用每個。
像這樣
?john Acompany task3
?white Dcompany task12
?carl Bcompany task8
?mark Ccompany task97
桌子
用戶表
| ID | 名稱 | 性別 | company_id |
|---|---|---|---|
| 1 | 約翰 | 1 | 1 |
| 2 | 白色的 | 1 | 4 |
| 3 | 卡爾 | 1 | 2 |
| 4 | 標記 | 1 | 3 |
公司表
| ID | 公司名 | 行業_1 | 行業_2 |
|---|---|---|---|
| 1 | 一家公司 | 3 | 9 |
| 2 | B公司 | 6 | 10 |
| 3 | 公司 | 1 | 3 |
| 4 | 公司 | 4 | 8 |
任務表
| ID | 任務名稱 | company_id |
|---|---|---|
| 1 | 任務 3 | 1 |
| 2 | 任務12 | 4 |
| 3 | 任務97 | 3 |
| 4 | 任務8 | 2 |
試過
我認為我可以將每個元素打包到一個陣列中,如下所示。但是我無法想象如何實作它,所以我放棄了。
user_name = []
users.each do |user|
user_name << user.name
end
uj5u.com熱心網友回復:
您可以使用joinsActiveRecord 中的方法并使用以下方法獲取您要查找的列pluck:
user_details = User.joins(company: :tasks).pluck("users.name", "companies.company_name", "tasks.task_name")
#=> [["john", "Acompany", "task3"], ["white", "Dcompany", "task12"], ...]
接下來,遍歷從上述代碼回傳的陣列陣列,以您想要的方式顯示資料。請記住,在您的資料庫架構中,一家公司的has_many任務可能是同一家公司的多個陣列,如果該公司有多個任務。
user_details.each do |user_detail|
puts "? " user_detail.join(" ")
end
基于max評論的其他(和首選)解決方案:
User.includes(company: :tasks).each do |user|
# Here you can retrieve and display the data you need using user.name, user.company.name, user.company.tasks
end
uj5u.com熱心網友回復:
這不是一個好主意。通過將陣列從控制器傳遞到視圖,您將完全跳過模型層并跳過它在反序列化和封裝(以及更多)方面提供的所有內容。處理簡單的陣列也會破壞代碼的可讀性:
# which one of these was what now?
<tr>
<td><%= data[0] %></td>
<td><%= data[1] %></td>
</tr>
畢竟它是一個用面向物件語言構建的 MVC 框架。你的代碼不應該是那樣的。
相反,您可以使用預先加載和委托:
class User < ApplicationRecord
belongs_to :company
delegate :name, to: :company, prefix: true
end
@users = User.eager_load(:company)
.all
<table>
<thead>
<tr>
<th>Name</th>
<th>Company</th>
</tr>
</thead>
<tbody>
<%= @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.company_name %></td>
# ...
</tr>
</tbody>
<% end %>
在某些情況下,您可能希望使用以下方法joins從關聯中選擇單個列或聚合:
class UsersController
def index
@users = User.joins(:company)
.select(
'users.*', 'companies.name AS company_name'
)
end
end
當涉及到任務時,您必須弄清楚您想要實際顯示的內容。由于關聯對于用戶和公司來說很可能是多對多的,因此不清楚應該列出哪個任務。他們都是?首先?最后?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/385771.html
標籤:红宝石轨道
上一篇:二級表上的Arel左外連接
