铁轨独特的多对多关系

时间:2015-01-14 23:40:51

标签: ruby-on-rails ruby join unique

我正在使用rails 4并且使用:has_many :through拥有多对多的关系,并且我正在努力确保连接是唯一的,以便特定的电影和标签不会多次相互连接。通过使用validates_uniqueness_of我在保存之间实现了这一点,但是如果在一次更新中添加了两个或更多相同的标签,则无法确保唯一性。请在下面找到相关代码:

class Film < ActiveRecord::Base
  has_many :film_tags, inverse_of: :film, dependent: :destroy
  has_many :tags, -> {uniq}, through: :film_tags

  accepts_nested_attributes_for :film_tags, allow_destroy: true
end

class FilmTag < ActiveRecord::Base
  belongs_to :film, inverse_of: :film_tags
  belongs_to :tag, inverse_of: :film_tags, counter_cache: true

  validates_uniqueness_of :tag_id, scope: :film_id, message: "duplicate tag"
end

class Tag < ActiveRecord::Base
  has_many :film_tags, inverse_of: :tag, dependent: :destroy
  has_many :films, -> {uniq}, through: :film_tags

  validates_uniqueness_of :name
end

我尝试添加before_savefilm.film_tags .uniq对其进行操作的电影(也尝试了uniq{|film_tag| film_tag.tag_id}),但这只删除了所有film_tag个连接但即使某些标签没有重复,也要1。

任何人都可以提供此问题的帮助吗?或者,如果需要更多信息,请询问。

1 个答案:

答案 0 :(得分:0)

这种情况发生是因为唯一性验证试图找到重复记录。在这种情况下,对于这两个标记,实际DB中不存在记录。因此两者都通过验证并在DB中创建标签。

我过去遇到过类似的问题。

但我使用了以下博客中提到的方法。

https://techbrownbags.wordpress.com/2014/02/05/rails-validation-of-cocoon-nested-forms/

希望它有所帮助。