我正在研究的一个应用程序,试图在不使用多态的情况下使用多态的概念。
class User
has_many :notes
end
class Customer
has_many :notes
end
class Note
belongs_to :user
belongs_to :customer
end
本来我们在笔记上有两列:user_id
和customer_id
,现在这里的不好之处就是笔记现在可能有customer_id
和user_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
答案 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