Rails 4如何使用唯一列值验证has_many

时间:2015-09-02 03:50:33

标签: ruby-on-rails-4 rails-activerecord

这是提供的示例:

has_many :spam_comments, -> { where spam: true }, class_name: 'Comment'

是否可以执行以下操作:

class Driver < ActiveRecord::Base
  belongs_to :vehicle
end

class Vehicle < ActiveRecord::Base
  has_many :drivers, -> { where('name').distinct }
end

我的场景不是一个has_many,这就是为什么我删除了class_name:子句。

我想要实现的是阻止将驱动程序加载到Vehicle的集合中,除非驱动程序名称是唯一的。

herbie = Vehicle.create(name: 'Herbie')
fred = Driver.create(name: 'Fred')

herbie.drivers << fred

herbie.drivers << fred # This second association should not work.

1 个答案:

答案 0 :(得分:4)

您可以在此处使用scope唯一性选项。

Driver模型中,添加以下内容

validates_uniqueness_of :name, scope: :vehicle_id

此外,您应该添加如下迁移:

add_index :drivers, [ :vehicle_id, :name ], :unique => true

避免竞争条件。有关详情,请查看this