簡體   English   中英

如何從關聯訪問聯接表屬性(has_many:through)

[英]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.

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