如何从关联访问连接表属性(has_many:through)

时间:2017-06-10 23:23:58

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord has-many-through

我尝试使用相关记录的属性创建记录列表。获取Task goal属性继承\ replace 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条记录每次都会向db发出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的情况下完成这项工作,因为这是一个可悲的常见问题。

1 个答案:

答案 0 :(得分: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与任务不匹配。 但就我而言,它完美无缺。

如果您想添加其他参数,这些参数在普通Task上不存在,但存在于Power表中,并且您想将其添加到tasks,那么在模型中我们可以:

class Task < ActiveRecord::Base
   attr_accessor :cookies

task.cookies = power_tasks[i].cookies