2009-10-27 41 views
0

我有以下問題:檢查列入的ActiveRecord的has_many協會

我有一個Widget ActiveRecord模型,有一些領域,我們將field_a和field_b打電話給他們,除了標準的Rails領域。我還有一個名爲Person的模型,它通過has_many關聯(Person.widgets)具有許多小部件。

在我的控制器的Widget的創建操作中,我想檢查以確保我從參數{@widget = Widget.new(params [:widget])}創建的新Widget不存在於Person.widgets集合在將新小部件保存到數據庫之前,但使用Person.widgets.include?(@小部件)不會給我想要的結果,如果field_a和field_b具有與集合中的小部件相同的值。

我猜測這是因爲新的小部件(@widget)在技術上不存在於該集合中,因爲它是一個新記錄,即使它的重要屬性(field_a和field_b)可能與已關聯的DB與Person的實例。

任何想法,我可能會去檢查這個,所以我不創建功能上重複的小部件在關聯到同一個人實例的數據庫?我試圖覆蓋散列,eql?和Widget模型上的==方法,但打破了一些其他的東西......謝謝TDD! :-)

謝謝, 邁克

回答

0
class Widget 
    before_save :validate_unique_for_person 
    def matches?(w) 
    field_a == w.field_a && field_b == w.field_b 
    end 
    def validate_unique_for_person 
    errors.add("base","widget already exists for person") if person.widgets.any? { |w| matches?(w) && self != w } 
    end 
end 
+0

感謝您的幫助......我試圖想要一點點幻想,但這個伎倆! – user197735 2009-10-28 23:36:41

0

有沒有你不能只用ActiveRecord::Validations#validates_uniqueness_of理由嗎?

validates_uniqueness_of :field_a, :scope => [:person_id, :field_b] 
validates_uniqueness_of :field_b, :scope => [:person_id, :field_a] 

應該這樣做,即使驗證消息有時可能有點混亂。但這就是用於驗證的消息選項。

+1

應該只能在Widgets模型中使用'validates_uniqueness_of:person_id,:scope [:field_a,:field_b]'。 – EmFi 2009-10-28 04:37:01

+0

這也應該工作,雖然默認的錯誤信息可能會讓你的思想融化(因爲它們都會倒退)。 – cwninja 2009-10-28 18:24:49