我有一个has_many:通过两个表(Post和Category)之间的关联设置。我使用has_many:而不是HABTM的原因是我想在连接表(PostCategory)上做一些验证。
所以我在这里使用了4个模型:
用户:
has_many :posts
has_many :categories
发表:
belongs_to :user
has_many :post_categories
has_many :categories, :through => :post_categories
类别:
belongs_to :user
has_many :post_categories
has_many :posts, :through => :post_categories
PostCategory:
belongs_to :post
belongs_to :category
基本上我想要的是:用户可以创建帖子,用户也可以创建自己的类别。然后,用户可以对帖子进行分类(不仅仅是他们的帖子,任何帖子)。帖子可以由许多不同的用户(可能以不同的方式)进行分类,一个类别可以包含许多不同的帖子(用户可以根据他们的特定类别对N个帖子进行分类)。
这对我来说有点棘手(我是Rails noob)。 一个帖子只能属于给定用户的一个类别。也就是说,对于任何用户来说,帖子不能属于多个类别。
我希望能够为此创建验证。我一直无法弄清楚如何。 我尝试过(在PostCategory内部)
validates_uniqueness_of :post_id, :scope => :category_id
但我意识到这是不正确的。这样可以确保帖子属于1个类别,这意味着在一个用户对帖子进行分类后,其他用户就无法进行分类。
我真正想要的是如何在我的PostCategory模型中(或其他任何地方)验证这一点。我也不反对改变我的数据库模式,如果这会让事情变得更容易(我觉得这个架构非常简单)。
有什么想法吗?
答案 0 :(得分:3)
最简单的方法是将user_id
添加到PostCategory
,并使用post_id
范围验证user_id
的唯一性。
另一种方法是创建自定义验证,如果类别所有者已在该帖子中添加了类别,则使用sql进行检查。
答案 1 :(得分:2)
选项1:使用before_save
。在其中,执行SQL查找以确保不存在具有类似用户类别的帖子(注意在编辑时,您必须确保不查找当前的帖子,已经在DB)
选项2:自定义验证器: http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#custom-validators
从未使用它们,但听起来它可以做你想做的事情