2013-03-13 51 views
0

我有User模型,其has_many DishRecommendation。我想強制執行Dish的唯一性,以及Recommendation的唯一性。在has_many中強制模型的唯一性雖然

我該怎麼處理ActiveRecord

在我dish.rb

validate_uniqueness_of :dish_name 

我想擁有的是:當用戶推薦一道菜,創建一個新的菜,如果它不存在,然後創建推薦。如果這道菜已經存在,那麼只需創建建議並指向現有的菜。

我是否需要手動處理這些情況(即檢查控制器中是否存在dish),或者ActiveRecord有辦法在內部處理它?

更新: validate_uniqueness_of :dish_name只檢查並返回錯誤消息,如果dish在那裏創建。它可能不會創建指向現有的dish的新的recommendation

+0

與'validate_uniqueness_of:dish_name' ActiveRecord的將驗證它,你不必擔心買了兩個菜,在你的'dish'表完全相同的名稱。如果你的屬性名稱是'name',那麼在驗證中把它放在':name'中。如果它真的叫做'dish_name',那麼就把它寫下來。 – Zippie 2013-03-13 14:06:17

+0

Zippie:請檢查我更新的問題 – AdamNYC 2013-03-13 14:09:47

回答

2

你總是可以.find_or_create_by_<attribute>找到與

+2

只是FYI:'find_or_create_by'將在Rails 4中被棄用。新的語法是'where(屬性:'...')。first_or_create'。請參閱http://blog.remarkablelabs.com/2012/12/what-s-new-in-active-record-rails-4-countdown-to-2013 – Sam 2013-03-13 14:27:54

+0

中的棄用搜索器部分。此外,我認爲這比find_or_create更清潔 – 2013-03-13 15:18:35

1

開始當我看到,多個用戶可以推薦同樣的菜的菜。

你的模型應該是這樣的:

Class User < ActiveRecord::Base 
has_many :recommendations 
has_many :dishes, :through => :recommendations 
end 

Class Dish < ActiveRecord::Base 
has_many :recommendations 
has_many :users, :through => :recommendations 
end 

所以在數據庫中的建議表應該有兩列(在它旁邊的ID和時間戳)呼籲user_iddish_id。爲了驗證用戶不建議 同樣的菜兩次,這樣做:

Class Recommendations < ActiveRecord::Base 
belongs_to :dish 
belongs_to :user 
validates_uniqueness_of :dish_id, :scope => :user_id 
end 

,我不知道那丹推薦.find_or_create_by方法,所以definetly嘗試使用類似的東西。

希望我幫助:)

+0

非常感謝您的詳細解答,儘管我知道這一部分。 – AdamNYC 2013-03-13 14:33:07

+0

哦,好吧,對不起,我只是寫下來,以確保我與你的協會在同一頁面,有點寫它,所以你可以看到如何驗證建議表的獨特性:) 希望你會得到一個很好的答案:) – Zippie 2013-03-13 14:36:01

+0

謝謝Zippie。我剛剛瞭解到有關驗證:範圍(我的第一個版本的問題得到了錯誤:)) – AdamNYC 2013-03-13 14:50:26

相關問題