has_many:虽然使用DISTINCT选项不起作用

时间:2016-12-12 02:20:44

标签: ruby-on-rails

尝试了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级)“

我对它的运作方式有误解吗?

1 个答案:

答案 0 :(得分:1)

根据我的看法,您根本没有唯一性验证 - 只有在您将关联保存到数据库后尝试访问关联时,您的约束才会运行。

在你遇到错误之前会发生错误...它的发生是因为你在数据库本身有一个唯一性约束,它(正确地)阻止了副本的保存。

如果您不想收到该错误消息,那么您需要一个Active Record验证......以validates开头的字样 - 然后您无法测试该计数等于一 - 因为它总是会(在过程的早期阶段被阻止)。