Rails:验证3列的唯一组合

Nie*_*ian 61 ruby-on-rails ruby-on-rails-3

嗨,我不想在我的表中验证3列的独特组合.

假设我有一个名为cars的表,其值为:brand,:model_name和:fuel_type.

我当时想要的是根据这些记录的组合来验证记录是否是唯一的.例如:

    brand    model_name    fuel_type
    Audi     A4            Gas
    Audi     A4            Diesel
    Audi     A6            Gas
Run Code Online (Sandbox Code Playgroud)

应该都有效.但"奥迪,A6,气体"的另一项记录不应该有效.

我知道这个验证,但我怀疑它实际上做了我想要的.

    validates_uniqueness_of :brand, :scope => {:model_name, :fuel_type}
Run Code Online (Sandbox Code Playgroud)

小智 107

您的代码段中存在语法错误.正确的验证是:

validates_uniqueness_of :car_model_name, :scope => [:brand_id, :fuel_type_id]
Run Code Online (Sandbox Code Playgroud)

或者甚至更短的红宝石1.9.x:

validates_uniqueness_of :car_model_name, scope: [:brand_id, :fuel_type_id]
Run Code Online (Sandbox Code Playgroud)

使用rails 4你可以使用:

validates :car_model_name, uniqueness: { scope: [:brand_id, :fuel_type_id] }
Run Code Online (Sandbox Code Playgroud)

轨道5可以使用

validates_uniqueness_of :car_model_name, scope: %i[brand_id fuel_type_id]
Run Code Online (Sandbox Code Playgroud)

  • :model_name引用OP关于汽车模型的问题而不是模型类:P (13认同)
  • rails 4示例是否真的正确?我认为它应该是这样的:`validates:brand_id,uniqueness:{scope:[:fuel_type_id]}`(即不引用模型名称). (2认同)

Ale*_*der 15

取决于您的需求,您还可以添加约束(作为表创建迁移的一部分或作为单独的一部分)而不是模型验证:

add_index :the_table_name, [:brand, :model_name, :fuel_type], :unique => true
Run Code Online (Sandbox Code Playgroud)

如果多个数据库连接同时执行写操作,则在数据库级别添加唯一约束是有意义的.


Rub*_*Dev 5

到 Rails 4 正确的代码和新的散列模式

validates :column_name, uniqueness: {scope: [:brand_id, :fuel_type_id]}
Run Code Online (Sandbox Code Playgroud)