Ruby on rails 在Rails 4中,在一个has_中使用uniq,并且_属于许多关系

Ruby on rails 在Rails 4中,在一个has_中使用uniq,并且_属于许多关系,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,我试图在has\u和\u属于\u many关系上实现一个唯一的约束,如下所示: class User has_and_belongs_to_many :foos, uniq: true end 因为我在调用user.foos时只需要uniquefoos,所以我添加了uniq选项。升级到Rails 4后,我开始收到以下警告: 弃用警告:您的 User.has_和_属于_许多:不推荐使用foos声明::uniq。 请改用范围块。例如,以下各项: has_many :spam_comment

我试图在
has\u和\u属于\u many
关系上实现一个唯一的约束,如下所示:

class User
  has_and_belongs_to_many :foos, uniq: true
end
因为我在调用
user.foos
时只需要unique
foos
,所以我添加了
uniq
选项。升级到Rails 4后,我开始收到以下警告:

弃用警告:您的 User.has_和_属于_许多:不推荐使用foos声明::uniq。 请改用范围块。例如,以下各项:

  has_many :spam_comments, conditions: { spam: true }, class_name: 'Comment'
  has_many :spam_comments, -> { where spam: true }, class_name: 'Comment'
应重写如下:

  has_many :spam_comments, conditions: { spam: true }, class_name: 'Comment'
  has_many :spam_comments, -> { where spam: true }, class_name: 'Comment'
我尝试了许多不同的组合,并通读了源代码,但不知道如何编写唯一约束来删除警告

class User
  has_and_belongs_to_many :foos, -> { uniq }
end

根据

可能会有帮助,但如果你在添加回调后使用
,每次againI知道这是一个旧答案时都会重复,但无论如何都会进行评论。谢谢,它运行良好,并向生成的SQL添加了
DISTINCT
。但是您拥有的链接没有显示关于此的任何信息。在rails 5.1中,这将不再有效,应该是:
has_和_属于_many:foos,->{distinct}
奇怪的是,此验证似乎没有抢占数据库级别的约束。也就是说,如果您在迁移中还设置了
add_index:join_table、[:user_id、:foo_id]、unique:true
,然后您编写了一个测试/规范,以查看当您多次尝试将相同的
foo
添加到给定的
用户
时会发生什么,数据模型验证不会捕获重复的条目,正在向下传递到数据库并引发错误。如果有人有任何见解,我很高兴听到。@RyanLue我相信这是因为uniq/distinct只影响从数据库请求的内容,而不影响保存到数据库中的模型的行为。