通过rails中的连接模型验证唯一性

时间:2012-07-31 16:53:40

标签: ruby-on-rails

我有一个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模型中(或其他任何地方)验证这一点。我也不反对改变我的数据库模式,如果这会让事情变得更容易(我觉得这个架构非常简单)。

有什么想法吗?

2 个答案:

答案 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

从未使用它们,但听起来它可以做你想做的事情