2017-03-21 68 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