我有型号Vehicle,Tag,VehicleTag
class VehicleTag < ActiveRecord::Base
attr_accessible :vehicle_id, :tag_id, :capacity
belongs_to :vehicle
belongs_to :tag
validates_uniqueness_of :tag_id, :scope => [:vehicle_id]
end
我使用'nested_form_for'在vehicle_tags表中输入值,但是当用户多次选择相同的标签并将其保存在表格中时,validates_uniqueness_of不起作用。
但是当我在vehicle_tag中有一条记录时tag_id = 2,vehicle_id = 24,并且当用户再次选择相同的标记时,这次它的重要唯一性验证。因为我第一次得到DB并且第二次没有价值。
但是当用户选择多个相同的标签时,我想通过唯一性。
编辑:vehicle_tag表格结构:
+-----+------------+--------+----------+---------------------+---------------------+
| id | vehicle_id | tag_id | capacity | created_at | updated_at |
+-----+------------+--------+----------+---------------------+---------------------+
| 241 | 2 | 2 | 2 | 2014-04-22 11:35:11 | 2014-04-22 11:35:11 |
| 242 | 2 | 2 | 3 | 2014-04-22 11:35:11 | 2014-04-22 11:35:11 |
+-----+------------+--------+----------+---------------------+---------------------+
class Vehicle < ActiveRecord::Base
has_many :vehicle_tags
has_many :tags, :through => :vehicle_tags
accepts_nested_attributes_for :vehicle_tags, :reject_if => proc { |a| a['capacity'].blank? }, allow_destroy: true
end
class Tag < ActiveRecord::Base
has_many :vehicle_tags
has_many :vehicles, :through => :vehicle_tags
end
答案 0 :(得分:0)
你可以试试这个,就像单独的一行
validates :tag_id, :uniqueness => true
答案 1 :(得分:0)
来自docs:
并发和完整性:
将此验证方法与ActiveRecord :: Validations#save结合使用并不能保证不存在重复的记录插入,因为应用程序级别的唯一性检查本质上容易出现竞争条件。
...
解决此问题的最佳方法是使用ActiveRecord :: ConnectionAdapters :: SchemaStatements #add_index向数据库表添加唯一索引。在极少数情况下发生竞争条件时,数据库将保证该字段的唯一性。
生成新迁移以使用以下内容添加索引:
add_index(:vehicle_tags, [:vehicle_id, :tag_id], unique: true)
答案 2 :(得分:0)
如评论所述,请将此行添加到vehicle_tags
迁移文件中。
add_index :vehicle_tags, [:tag_id, :vehicle_id], :unique => true in your vehicle_tags
这会发生什么?
这将确保您的vehicle/tag
表中有唯一的vehicle_tags
对。