2016-01-24 135 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