ruby-on-rails - rails unique 多对多关系

标签 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_save 添加到电影中,其中 film.film_tags.uniq 对其运行(也尝试过 uniq{ |film_tag| film_tag.tag_id}) 但这只会删除所有 film_tag 加入,但 1 即使某些标签没有重复也是如此。

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

最佳答案

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

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

但是我已经使用了下面博客中提到的方法。

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

希望对您有所帮助。

关于ruby-on-rails - rails unique 多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954515/

相关文章:

ruby-on-rails - has_many:通过关联,shell 中的 rails 控制台中的 "No Method Error",NoMethodError:#<ActiveRecord::Relation:> 的未定义方法

jquery - 使用 Sinatra 和 jQuery 而不在 POST 上重定向

php - 如何获得MySQL集群索引排序联接结果

jpa - JPQL 查询中的 @OrderColumn

ruby-on-rails - Rails 3.1是否像有条件GET一样支持有条件的PUT?

java - JRuby/Warbler 导致没有这样的文件要加载 -- bundler/dep_proxy

ruby-on-rails - Rails 5:加入2个大文本文件

Ruby - 删除文件中的最后一个字符?

ruby-on-rails - Rails 使用正确的 URL 渲染命名路由

mysql - 从应该是相同的mysql表中获取丢失的数据