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 
相关问题