是否有验证来检查该实体是否已经存在值。如果有,那么它不会让用户在不破坏前一个值的情况下保存另一个值。
我可以显示一条消息,用户必须在创建新值之前销毁以前的值。这不是问题。
问题是是否有验证或方法来检查并只允许两个实体使用一个值?
我有两个字段长度和宽度,我只希望有一个长度值和一个宽度值。
非常感谢您阅读这个问题。我很感激我能得到的任何帮助。
是否有验证来检查该实体是否已经存在值。如果有,那么它不会让用户在不破坏前一个值的情况下保存另一个值。
我可以显示一条消息,用户必须在创建新值之前销毁以前的值。这不是问题。
问题是是否有验证或方法来检查并只允许两个实体使用一个值?
我有两个字段长度和宽度,我只希望有一个长度值和一个宽度值。
非常感谢您阅读这个问题。我很感激我能得到的任何帮助。
前面的答案将确保 :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 进行不同的验证。
我想我肯定误解了您要解决的问题。几个建议。
您可以使用validates_uniqueness_of
内置验证,并带有以下:scope
选项:
validates_uniqueness_of :length, :scope => :breadth
如果我理解正确,您需要提供 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"