如何检查带有参数的行是否存在,如果存在则回滚事务? [报告 6]

How do I check if a row with parameters exists and roll back transaction if it does? [RoR 6]

我是 Rails 的新手,我很难理解如何执行以下操作:

  1. 用户创建了一个条目,该条目具有两个值“名称”和“职位”。
  2. 我想检查数据库中是否已经存在该名称+职位组合
  3. 如果是这样,我希望数据库吐出一个错误,指出名称和位置已经存在。

我认为这会很简单...只需写下:

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