在has_many中实现模型的唯一性

时间:2013-03-13 14:02:17

标签: ruby-on-rails activerecord

我有一个User模型,其中包含DishRecommendation。我想强制Dish的唯一性以及Recommendation的唯一性。

我应该如何在ActiveRecord中解决这个问题?

在我的dish.rb

validate_uniqueness_of :dish_name

我想要的是:当用户推荐菜时,如果不存在则创建一个新菜,然后创建推荐。如果菜已经存在,那么只需创建推荐并指向现有菜。

我是否需要手动处理这些情况(即检查控制器中是否存在dish),还是ActiveRecord有办法在内部处理它?<​​/ p>

更新: validate_uniqueness_of :dish_name仅在dish创建recommendation时才会检查并返回错误消息。它可能不会创建指向现有dish的新{{1}}。

2 个答案:

答案 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_iddish_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方法,所以肯定会尝试使用类似的东西。

希望我帮助过:)