Rails has_many关联如何保证每条关联记录只有一条?
Rails has_many association how to guarantee only one of each associated record?
我基本上有这个系统:
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 方式做到这一点。
这是使用 ActiveRecord 唯一性验证完成的。
在这种情况下,我建议应该在 ArticleTag
模型中应用验证。如果您还没有此模型,请创建它。
class ArticleTag < ActiveRecord::Base
validates :tag_id, :uniqueness, scope: :article_id
end
这表示与给定文章关联的 ArticleTag 实例应该具有唯一性 tag_id。因此,如果您尝试为文章创建重复标签,则会引发验证错误。
我基本上有这个系统:
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 方式做到这一点。
这是使用 ActiveRecord 唯一性验证完成的。
在这种情况下,我建议应该在 ArticleTag
模型中应用验证。如果您还没有此模型,请创建它。
class ArticleTag < ActiveRecord::Base
validates :tag_id, :uniqueness, scope: :article_id
end
这表示与给定文章关联的 ArticleTag 实例应该具有唯一性 tag_id。因此,如果您尝试为文章创建重复标签,则会引发验证错误。