如何检查带有参数的行是否存在,如果存在则回滚事务? [报告 6]
How do I check if a row with parameters exists and roll back transaction if it does? [RoR 6]
我是 Rails 的新手,我很难理解如何执行以下操作:
- 用户创建了一个条目,该条目具有两个值“名称”和“职位”。
- 我想检查数据库中是否已经存在该名称+职位组合
- 如果是这样,我希望数据库吐出一个错误,指出名称和位置已经存在。
我认为这会很简单...只需写下:
class Rater < ApplicationRecord
validate :unique_position, :on => :create, :on => :edit
private
def unique_position
if Rater.where(name: name, position: position).any?
return false
end
end
end
我认为通过返回 FALSE,验证将不允许操作继续,但我能够创建重复项。我试过搜索网络和这个网站,尝试过不同的方法,但不确定我使用的关键字不正确。
欣赏任何方向。
您可以对其他列范围内的列使用唯一性验证。
这是可以帮助您的示例。
validates :name, presence: true, uniqueness: { scope: :position }
或
validates :name, uniqueness: { scope: :position }
*(如果名称字段不是必填项)。
如果位置是关联,则用户 position_id
具有作用域的外键。
例如:{ scope: :position_id }
.
您需要在 errors
对象中添加验证错误,而不是在验证失败时简单地返回 false
。
class Rater < ApplicationRecord
validate :validate_name_and_position_uniqueness, on: [:create, :update]
private
def validate_name_and_position_uniqueness
return true unless Rater.exists?(name: name, position: position)
errors.add :base, 'Name and position already taken.'
end
end
我是 Rails 的新手,我很难理解如何执行以下操作:
- 用户创建了一个条目,该条目具有两个值“名称”和“职位”。
- 我想检查数据库中是否已经存在该名称+职位组合
- 如果是这样,我希望数据库吐出一个错误,指出名称和位置已经存在。
我认为这会很简单...只需写下:
class Rater < ApplicationRecord
validate :unique_position, :on => :create, :on => :edit
private
def unique_position
if Rater.where(name: name, position: position).any?
return false
end
end
end
我认为通过返回 FALSE,验证将不允许操作继续,但我能够创建重复项。我试过搜索网络和这个网站,尝试过不同的方法,但不确定我使用的关键字不正确。
欣赏任何方向。
您可以对其他列范围内的列使用唯一性验证。 这是可以帮助您的示例。
validates :name, presence: true, uniqueness: { scope: :position }
或
validates :name, uniqueness: { scope: :position }
*(如果名称字段不是必填项)。
如果位置是关联,则用户 position_id
具有作用域的外键。
例如:{ scope: :position_id }
.
您需要在 errors
对象中添加验证错误,而不是在验证失败时简单地返回 false
。
class Rater < ApplicationRecord
validate :validate_name_and_position_uniqueness, on: [:create, :update]
private
def validate_name_and_position_uniqueness
return true unless Rater.exists?(name: name, position: position)
errors.add :base, 'Name and position already taken.'
end
end