尝试了has_many relationship
的distinct
选项
#user.rb
class User
has_many :badge_achievements
has_many :badges, -> { uniq }, through: :badge_achievements
我的测试定义了以下内容
#user_test.rb
user.badges.count.must_equal 1
# add the same badge again
user.badges << User::Badge.find(1)
user.badges.count.must_equal 1 #should not be changed
不幸的是,它似乎没有正确验证,因此mysql正在提升
Error:
a user::has many community badges#test_0004_can have every badge only once:
ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry '50-1' for key 'index_user_badge_achievements_on_user_id_and_badge_id': INSERT INTO
user_badge_achievements (
user_id ,
badge_id ,
created_at ,
updated_at ) VALUES (50, 1, '2016-12-12 02:17:56', '2016-12-12 02:17:56')
test/models/user_test.rb:124:in
阻止(3级)“
我对它的运作方式有误解吗?
答案 0 :(得分:1)
根据我的看法,您根本没有唯一性验证 - 只有在您将关联保存到数据库后尝试访问关联时,您的约束才会运行。
在你遇到错误之前会发生错误...它的发生是因为你在数据库本身有一个唯一性约束,它(正确地)阻止了副本的保存。
如果您不想收到该错误消息,那么您需要一个Active Record验证......以validates
开头的字样 - 然后您无法测试该计数等于一 - 因为它总是会(在过程的早期阶段被阻止)。