在Rails中,我希望能够有一个模型来检查列signature
的值是否已经存在,如果不存在,保存它,如果存在,则更新现有模型然后退出。 已成为模型解决方案。我不能使用控制器逻辑来实现这一点,它必须是自动的。
我尝试使用before_create
或before_save
等过滤器,但似乎没有一种干净的方法来阻止过滤器链并通过这些方式更新现有记录。任何帮助表示赞赏。感谢。
答案 0 :(得分:1)
以下代码适用于您可以使用的方法,而不是save
。它检查模型是否存在具有相同签名的模型。如果找到一个,它会使用属性更新现有模型,然后返回该模型。如果没有其他模型具有该签名,它将继续保存。您将不得不在需要此行为的地方使用此代替ActiveRecord的#save
。使用回调无法做到这一点,因为取消保存回调的唯一方法是让它返回false。
def save_signature
model = Model.find_by(signature: signature)
if model
model.update(attributes)
model
else
save
end
end
如果我理解你想要的东西,请告诉我。如果没有,那就指出我误解的内容,我很乐意相应地改变我的答案。
答案 1 :(得分:0)
也许不是最干净的方式,但为什么要停止连锁? 获取before_ *过滤器上的对象,检查并更新模型,它将与旧值一起保存。 你觉得怎么样?
答案 2 :(得分:0)
阅读find_or_create_by http://guides.rubyonrails.org/active_record_querying.html#find-or-create-by。这将创建一个新记录或输出前一个记录。希望它可能对你有用