[英]How to access join table attributes (has_many :through) from association
我正在嘗試使用相關記錄的屬性創建記錄列表。 獲取Task
goal
屬性繼承\\替換Power
goal
屬性
如果我們有:
@tasks = user.tasks
當我們渲染視圖時
<%= render @tasks %>
一切都很好,我們只能在部分應用中使用<%= task.goal %>
,但如果可以使用user.super_tasks
如何在部分應用中覆蓋目標?
首先想到的是在_task.htm.erbl
<%= goal = if @super_tasks then task.powers.find_by(user_id: current_user).goal else task.goal end %>
有點類似,但是如果您有3條記錄,就可以了,如果有15條記錄,每次都會有15條請求db查找連接表。
剛剛添加了表格以使其更加清晰:
class User < ActiveRecord::Base
has_many :tasks
has_many :powers
has_many :super_tasks , through: :powers, source: :task
end
class Task < ActiveRecord::Base
belongs_to :user
has_many :powers
end
class Power < ActiveRecord::Base
belongs_to :user
belongs_to :tasks
end
但是,如果用戶有權力,他們將承擔更多責任,這不是我第一次遇到該問題,請確保還有其他方法可以使這項工作無需每次都調用db,這是可悲的常見問題。
好的,也許這不是最好的解決方案,但它可以解決以下問題:
tasks = user.tasks.order(:id)
power_tasks = user.powers.order(:task_id)
tasks.each_with_index do |task,i|
task.goal = power_tasks[i].goal
end
該代碼的弱點在於,如果我們說沒有task_id
來訂購\\調整power
或者如果power_tasks
的數量與任務不匹配。 但是對於我來說,它運行得很好。
如果要添加其他參數,這些參數在普通Task
上不存在,但在Power
表上存在,並且您也想將其添加到tasks
,那么在模型中,我們可以:
class Task < ActiveRecord::Base
attr_accessor :cookies
task.cookies = power_tasks[i].cookies
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.