-1

是否有验证来检查该实体是否已经存在值。如果有,那么它不会让用户在不破坏前一个值的情况下保存另一个值。

我可以显示一条消息,用户必须在创建新值之前销毁以前的值。这不是问题。

问题是是否有验证或方法来检查并只允许两个实体使用一个值

我有两个字段长度和宽度,我只希望有一个长度值和一个宽度值。

非常感谢您阅读这个问题。我很感激我能得到的任何帮助。

4

3 回答 3

0

前面的答案将确保 :field1 和 :field2 值的组合是唯一的。我很难理解这个问题,但我认为 abhishek 实际上是在寻找一个更简单的答案。

我相信他想确保只有一个长度值和一个宽度值。

是长宽关联吗?还是属性?无论哪种情况,您可能都不需要打电话destroy来更换它们。只需更改属性或关联内的值,然后保存。

你能澄清一下吗?


好的,所以根据您的 Grid 模型,这些字段的值永远不会超过一个。您可以在初始成功验证后将记录标记为只读。然后,无论何时用户尝试更新该值,都会出现验证错误。您将需要编写一些简单的逻辑来覆盖 readonly 标志以满足您的需要。

现在,如果您总是想在存在值的情况下触发验证错误,那么您可以执行以下操作:

validate :error_if_length_exists, :if 'length.present?'
validate :error_if_breadth_exists, :if 'breadth.present?'

def error_if_length_exists
  errors.add(:length, "already exists, are you sure you want to update?")
end

def error_if_breadth_exists
  errors.add(:breadth, "already exists, are you sure you want to update?")
end

我想你想使用unless

def is_it_square
  unless (length == breadth)
     errors.add(:length, "Latest research and our experience shows that a rectangular region is more effective for this kind of mission.")
  end  
end

您还可以像这样确定验证范围: validates :length, :breadth, :presence_of => true, :on => :create仅在presence_of首次创建记录时应用检查。

似乎您可能希望对 :create 与 :update 进行不同的验证。


我想我肯定误解了您要解决的问题。几个建议。

  1. 我认为您不应该要求用户输入两个值,如果您要在它们不同时简单地添加一个错误。可用性的解决方案是在输入附近添加错误文本('我们发现正方形是最佳形状......'),让用户输入一个属性(如果你真的不需要长度和宽度,如果它们总是代表相同的值),并将您的计算更改为该值的平方,而不是乘以长度 * 宽度。
  2. 如果您需要长度/宽度,您能否更清楚地解释问题。假设您有一个表单或接口,它记录了给定模型的 :length 和 :breadth 属性。您还没有模型的实例。这是用户第一次与您的系统交互。输入作为请求的一部分发送到您的控制器,然后您创建一个具有有效 :length 和 :breadth 值的对象。随后,用户想要更改:length 和:breadth。您想创建一个包含 :length/:breadth 的模型的新实例,还是要更新现有模型实例的 :length/:breadth 属性?
于 2012-10-07T20:44:43.287 回答
0

您可以使用validates_uniqueness_of内置验证,并带有以下:scope选项:

validates_uniqueness_of :length, :scope => :breadth
于 2012-10-07T20:04:30.390 回答
0

如果我理解正确,您需要提供 2 个字段的唯一性组合。

然后以users表格为例

模型.rb

validates :field1, uniqueness: { :scope => :field2}

安慰

rails generate migration add_index_for_field1_and_field2_to_users

编辑迁移

class AddIndexFoField1AndField2ToUsers < ActiveRecord::Migration
  def change
    add_index :users, [:field1, :field2], unique: true
  end
end

运行迁移

rake db:migrate

瞧!

更新

如何检查您是否正确。

安慰

Model.create!(field1:"foo",field2:"bar") # true
Model.create!(field1:"foo",field2:"bar") # ActiveRecord::RecordInvalid: Validation failed: Field1 has already been taken

sql数据库

insert into table(field1, field2) values ("foo","bar") # true
insert into table(field1, field2) values ("foo","bar") # ERROR: diplicate key value violates unique constraint "index_table_on_field1_and_field2"
于 2012-10-07T20:04:58.847 回答