2016-01-24 138 views
0

验证唯一性适用于两个字段的组合。我的问题是修补一个确认的新记录,将引发错误ActiveRecord::RecordNotUnique PG::UniqueViolation: ERROR: duplicate key value violates unique constraint,而不是执行下面方法的else部分。为什么它会抛出错误而不是执行else部分?如何改变这一点?.save抛出错误而不是执行条件的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

这很可能意味着:

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

尝试从改变你的回调:

before_save :order_nodes 

到:

before_validation :order_nodes 

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

+0

谢谢!这工作完美。完美的解释也! – Nick

+0

@尼克,保重并阅读我附加的说明。 – Omnigazer