Rails 4覆盖belongs_to setter

时间:2015-03-10 04:25:21

标签: ruby-on-rails override setter belongs-to

我遇到了覆盖belongs_to属性的setter的问题。我有以下内容:

class Task < ActiveRecord::Base
belongs_to :parent_task, :class_name => 'Task', :foreign_key => 'parent_task_id'

def parent_task=(value)
  write_attribute(:parent_task, value)
  unless value == nil
    #remove all groups_belonging_to if this has been made into a child task -i.e. if it has a parent
    self.groups_belonging_to = []
  end
  self.save
end

用户模型有许多任务:

class User < ActiveRecord::Base
  has_many :tasks_created_by, class_name: 'Task', foreign_key: 'created_by_id', dependent: :destroy

在我的测试中,我正在创建一个类似的任务:

@child_task = @user.tasks_created_by.create!(name: "Task to Delete", parent_task: @top_parent)

出现错误:

ActiveModel::MissingAttributeError: can't write unknown attribute `parent_task`

当我删除覆盖时没有问题,所以我肯定在某种程度上做了覆盖错误。我在其他地方使用了非常相似的覆盖逻辑,但之前没有通过关系。

2 个答案:

答案 0 :(得分:1)

这可以更好地写为回调。您可以使用before_save回调来检查parent_task,如果已设置,请清除groups_belonging_to:

class Task < ActiveRecord::Base
  belongs_to :parent_task, class_name: 'Task', foreign_key: 'parent_task_id'

  before_save :clear_groups if: :parent_task

  def clear_groups
    self.groups_belonging_to = []
  end
end

答案 1 :(得分:0)

我在覆盖setter之前使用alias_method解决了这个问题:

class Task < ActiveRecord::Base

  belongs_to :parent_task, :class_name => 'Task', :foreign_key => 'parent_task_id'

  alias_method :set_parent_task, :parent_task=

  def parent_task=(value)
    set_parent_task(value)
    unless value == nil
      #remove all groups_belonging_to if this has been made into a child task -i.e. if it has a parent
      self.groups_belonging_to = []
    end
    self.save
  end

emd