.save抛出错误而不是执行条件的else部分
问题描述:
验证唯一性适用于两个字段的组合。我的问题是修补一个确认的新记录,将引发错误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
答
这很可能意味着:
- 你的对象通过验证。
- 那么你before_save回调重新排序字段
- 后续尝试保存记录到数据库中违反了数据库唯一约束
尝试从改变你的回调:
before_save :order_nodes
到:
before_validation :order_nodes
注意:在这种情况下,您必须假设您的字段可能无效,并相应地重写您的回调。
谢谢!这工作完美。完美的解释也! – Nick
@尼克,保重并阅读我附加的说明。 – Omnigazer