我有一个User
模型,其中包含Dish
到Recommendation
。我想强制Dish
的唯一性以及Recommendation
的唯一性。
我应该如何在ActiveRecord
中解决这个问题?
在我的dish.rb
:
validate_uniqueness_of :dish_name
我想要的是:当用户推荐菜时,如果不存在则创建一个新菜,然后创建推荐。如果菜已经存在,那么只需创建推荐并指向现有菜。
我是否需要手动处理这些情况(即检查控制器中是否存在dish
),还是ActiveRecord有办法在内部处理它?</ p>
更新:
validate_uniqueness_of :dish_name
仅在dish
创建recommendation
时才会检查并返回错误消息。它可能不会创建指向现有dish
的新{{1}}。
答案 0 :(得分:2)
您可以随时.find_or_create_by_<attribute>
找到以
答案 1 :(得分: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
因此,数据库中的Recommendations表应该有两列(在它的id和时间戳旁边),名为user_id
和dish_id
。验证用户不推荐
相同的菜两次,做:
Class Recommendations < ActiveRecord::Base
belongs_to :dish
belongs_to :user
validates_uniqueness_of :dish_id, :scope => :user_id
end
而且我不知道Dan推荐的.find_or_create_by
方法,所以肯定会尝试使用类似的东西。
希望我帮助过:)