自定义belongs_to属性writer

时间:2017-03-21 16:50:30

标签: ruby-on-rails activerecord

我正在研究的一个应用程序,试图在不使用多态的情况下使用多态的概念。

class User
 has_many :notes
end

class Customer
 has_many :notes
end

class Note
 belongs_to :user
 belongs_to :customer
end

本来我们在笔记上有两列:user_idcustomer_id,现在这里的不好之处就是笔记现在可能有customer_iduser_id与此同时,我不想要。

我知道一个简单/更好的方法就是使notes表具有多态性,但是有一些限制,阻止我现在就这样做。

我想知道是否有一些自定义方法可以覆盖这些关联,以确保在分配一个关联时,另一个是未分配的。

以下是我尝试过的内容:

def user_id=(id)
  super
  write_attribute('customer_id', nil)
end

def customer_id=(id)
  super
  write_attribute('user_id', nil)
end

使用时不起作用:

note.customer=customer or 
note.update(customer: customer)

但在使用时有效:

note.update(customer_id: 12)

我基本上需要一个适用于这两种情况的方法,而不必编写4种方法:

def user_id=(id)

end

def customer_id=(id)

end

def customer=(id)

end

def user=(id)

end

1 个答案:

答案 0 :(得分:1)

我宁愿使用ActiveRecord回调来实现这样的结果。

class Note

  belongs_to :user
  belongs_to :customer

  before_save :correct_assignment

  # ... your code ...

  private

  def correct_assignment
    if user_changed?
      self.customer = nil
    elsif customer_changed?
      self.user = nil
    end
  end

end