0

我試圖用相關記錄的屬性創建記錄列表。獲得Taskgoal屬性繼承\更換Power - goal屬性如何從關聯中訪問連接表屬性(has_many:through)

如果我們有:

@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請求分貝每次查找連接表。

剛剛添加的表,使之更加明確:

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,因爲它可悲的是常見的問題。

+0

參見[活動記錄查詢接口 - 連接表](http://guides.rubyonrails.org/active_record_querying.html#joining-tables)和[活動記錄查詢接口 - 急切加載關聯](http://guides.rubyonrails.org/active_record_querying .html#eager-loading-associations) –

+0

即使您「加入」或「急切加載」,您仍需要遍歷所有記錄,例如: <%task.powers.each do | pw | %> <%如果pw.user_id == current_user.id%> <%= pw.goal%> <% end %> <% end %> 它會工作,但這不是乾淨的方式,我找了。 – GEkk

回答

0

好吧,也許它不是最好的解決方案,但它的工作原理,並回答了這個問題:

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與任務不匹配。 但對於我的情況,它的工作完美。

如果要添加其他PARAM,即在正常Task不存在的,但Power表中存在,並希望將其添加到tasks也,然後在模型中,我們可以:

class Task < ActiveRecord::Base 
    attr_accessor :cookies 

task.cookies = power_tasks[i].cookies 
相關問題