nested_form_for rails的唯一性无效

时间:2014-04-22 11:19:09

标签: ruby-on-rails ruby-on-rails-3

我有型号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

3 个答案:

答案 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对。