2017-03-21 69 views
0

我正在处理的一个应用程序试图在不使用多态性的情况下使用多态的概念。自定义belongs_to属性编写器

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在同一时间,这是我不想要的。

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

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

这里是我试过的:当使用

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

我宁愿使用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 
+0

谢谢。这个问题是,在坚持一条记录之前,我会同时记录两个状态,因此,如果我有一个像'before_save:do_something_to_owner'这样的应用程序,那么该应用程序就会变得混乱,因为这两个状态当前存在并且依赖于顺序回调不好。另一个越野区域将一次更新两个字段,现在总是回退到第一个分支,现在假设我只是将字段更新为零,然后我还需要再次检查参数。虽然似乎是一个很好的解决方案,但我认为它会在以后出现更多的错误。我想我会在这里明确 – oreoluwa