Rails has_many 关联如何保证每条关联记录只有一个?

Posted

技术标签:

【中文标题】Rails has_many 关联如何保证每条关联记录只有一个?【英文标题】:Rails has_many association how to guarantee only one of each associated record? 【发布时间】:2021-10-14 10:32:28 【问题描述】:

我基本上有这个系统:

class Article < ApplicationRecord
  has_many :tag_associations
  has_many :tags, through :tag_associations
end

class Tag < ApplicationRecord
  # attr :name
end

如何使文章只能具有每个标签名称之一?也就是说,假设我有这些标签:

 name: 'foo' 
 name: 'bar' 
 name: 'baz' 

我希望这是最终结果:

tag1 = Tag.create!(name: 'foo')
tag2 = Tag.create!(name: 'bar')
tag3 = Tag.create!(name: 'baz')
article.tags << tag1
article.tags << tag2
article.tags << tag1
article.tags << tag1
article.tags << tag1
article.save!
article.tags # => [tag1, tag2]

我如何实现这一目标?我对 Rails 范例不是很熟悉,即使使用普通的 SQL,我也不确定如何以一般方式执行此操作。但我只是在寻找如何以 Rails 的方式做到这一点。

【问题讨论】:

【参考方案1】:

这是使用 ActiveRecord 唯一性验证完成的。

在这种情况下,我建议在ArticleTag 模型中应用验证。如果您还没有此模型,请创建它。

class ArticleTag < ActiveRecord::Base

  validates :tag_id, :uniqueness, scope: :article_id

end

这表示与给定文章关联的 ArticleTag 实例应该具有唯一的 tag_id。因此,如果您尝试为文章创建重复标签,则会引发验证错误。

【讨论】:

以上是关于Rails has_many 关联如何保证每条关联记录只有一个?的主要内容,如果未能解决你的问题,请参考以下文章

Rails has_many,如何实现嵌套关联?

如何通过rails中的关联定义has_many

在 Rails 中,如何在一个查找器中查询两个 has_many 关联?

如何将参数传递给 Rails 4 中的 has_many 关联范围?

如何区分相似的has_many:通过Rails中的关联?

如何将记录添加到has_many:通过rails中的关联