1

我有一个 has_many :through 两个表(帖子和类别)之间的关联设置。我使用 has_many :through 而不是 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

帖子类别:

belongs_to :post
belongs_to :category

基本上我想要的是:用户可以创建帖子,用户也可以创建自己的类别。然后,用户可以对帖子进行分类(不仅仅是他们的帖子,任何帖子)。一个帖子可以被许多不同的用户分类(可能以不同的方式),一个类别可以包含许多不同的帖子(一个用户可以将 N 个帖子归类到他们的特定类别下)。

这对我来说有点棘手(我是 Rails 菜鸟)。 对于给定用户,帖子只能属于一个类别。也就是说,对于任何用户来说,一个帖子不能属于一个以上的类别。

我想要做的是为此创建一个验证。我一直无法弄清楚如何。我已经尝试过(在 PostCategory 内)

validates_uniqueness_of :post_id, :scope => :category_id

但我意识到这是不正确的。这只会确保帖子属于 1 个类别,这意味着在一个用户对帖子进行分类后,其他用户就不能这样做了。

我真正要寻找的是如何在我的 PostCategory 模型(或其他任何地方)中验证这一点。我也不反对更改我的数据库架构,如果这会使事情变得更容易(我只是觉得这个架构非常简单)。

有任何想法吗?

4

2 回答 2

3

最简单的方法是添加user_idPostCategory验证范围的唯一post_iduser_id

另一种方法是创建自定义验证,如果类别所有者已将类别添加到该帖子,则使用 sql 检查。

于 2012-07-31T17:12:52.397 回答
1

选项 1:使用before_save. 在其中,执行 SQL 查找以确保不存在与您的用户具有相似类别的帖子(请注意在编辑时,您必须确保不查找当前帖子已经在数据库中)

选项 2:自定义验证器:http: //guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#custom-validators

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

于 2012-07-31T17:05:59.157 回答