.save抛出错误而不是执行条件的else部分

时间:2016-01-24 11:39:44

标签: ruby-on-rails ruby postgresql ruby-on-rails-4

唯一性验证适用于两个字段的组合。我的问题是修补一个确实有效的新记录会抛出错误ActiveRecord::RecordNotUnique PG::UniqueViolation: ERROR: duplicate key value violates unique constraint,而不是它执行下面方法的else部分。为什么它会抛出错误而不是执行else部分?如何改变这个?

def create
  first_node = Node.find_by(id: params[:first_node_id])
  second_node = Node.find_by(id: params[:second_node_id])
  link = first_node.where_first_links.build(create_params)
  if link.save
    render json: link, status: :created
  else
    render json: link, message: "unable", status: :bad_request
  end
end

在迁移文件中:

add_index :links, [:first_node_id, :second_node_id], unique: true

模型验证:

before_save  :order_nodes
validates :first_node_id,    presence: true
validates :second_node_id,   presence: true
validates :first_node_id,    uniqueness: { scope: :second_node_id } 

def order_nodes
  if first_node_id > second_node_id
    first = first_node_id
    second = second_node_id
    self.first_node_id  = second
    self.second_node_id = first
    if direction == '0'
      self.direction = 1
    elsif direction == '1'
      self.direction = 0
    end
  end
end

1 个答案:

答案 0 :(得分:1)

这很可能意味着:

  • 您的对象已通过验证。
  • 然后你的before_save回调重新排序字段
  • 后续尝试将记录保存到数据库违反了数据库唯一约束

尝试更改您的回调:

if(isNaN(number) || charactersLength !=9  )

为:

before_save  :order_nodes

注意:在这种情况下,您必须假设您的字段可能无效并相应地重写您的回调。