2011-05-30 84 views
2

我有如下嵌套模型關係:在Rails中,如何交換現有對象的新對象?

  • 國家(ID,姓名)
    • 省(ID,COUNTRY_ID,名)
      • 城市(ID,province_id,名)

我有validates_uniqueness_of約束int在關係中的每個模型的名稱字段上,以及數據庫中名稱列上的唯一索引。

我想在驗證之前的某個時間點交換一個與現有記錄具有相同名稱的新對象。換句話說,如果用戶嘗試添加已添加的城市,省份和國家/地區組合,我希望國家/地區模型返回對相應現有模型記錄的引用,而不是在保存前驗證失敗。

我無法使用模型回調(after_initialize,before_validation等),我無法讓Country.find_or_initialize_by_name與嵌套模型一起工作......有什麼建議嗎?

+0

的「基於動態屬性的查找程序」部分。您能給我們提供一些關於您遇到麻煩的更多信息嗎?錯誤是否被拋出?如果是這樣,他們說什麼?你給我們提供的信息越多,幫助就越容易。 – sosborn 2011-05-30 02:40:19

回答

1

你試圖做的事聽起來很難,可能需要你瞭解ActiveRecord::Base的很多內部實現細節。

相反,你可以做這樣的事情嗎?

@country = Country.find_or_initialize_by_name(params[:name]) 
... 
@country.save 

編輯: ActiveRecord的內置了find_or_create_by_XXXfind_or_initialize_by_XXX功能,所以沒有必要的功能添加到模型。欲瞭解更多信息,請參閱http://api.rubyonrails.org/classes/ActiveRecord/Base.html

+0

我可能會遇到同樣的問題,我已經使用'find_or_initialize_by_name':嵌套的模型不使用此方法,所以它將在國家正常工作,但該省將拋出驗證錯誤,因爲它內部它不會調用'find_or_initialize_by_name'。 – Andrew 2011-05-30 00:34:34

+0

我不明白你想要省模型做什麼。什麼代碼想運行,你希望它的行爲如何?如果是我,我只需找到/創建國家,然後將國家ID傳遞給您用來創建省的任何功能;那麼省就不需要自動創建國家了。但是如果你真的想要的話,你應該能夠做到這一點。 – 2011-05-30 00:37:37

+0

我知道'find_or_initialize'方法,我把它列爲在我的問題中失敗的嘗試(至少按照我的嘗試)。嵌套關係是相反的;一個國家被創建並接受各省的嵌套屬性。反過來,一個省接受城市的嵌套屬性。 – Andrew 2011-05-30 00:53:47

相關問題