更好的检查方法如果模型存在则更新它

时间:2014-12-21 01:22:53

标签: ruby-on-rails ruby

因为我有模型的唯一键,

如果新记录尝试使用现有的**唯一键**

创建

应该失败。

但我希望行为是那个

如果(创建文件)则(更新现有记录)。

    begin
        Model.create(DATA)  
    rescue Exception => e
      Model.update(DATA)
    end

我的代码有任何副作用吗?

2 个答案:

答案 0 :(得分:2)

您可以使用find_or_initialize_by method

Model.find_or_initialize_by(key: :my_key) do |model|
  model.attr_1 = "New attribute 1."
  model.attr_2 = "New attribute 2."
  model.save
end

另请注意,拯救Exception通常不被视为一种好习惯。您可能应该正在拯救ActiveRecord::RecordInvalidActiveRecord::ActiveRecordError,或至少StandardError

答案 1 :(得分:0)

答案取决于您的Rails版本。在Rails 4中你会做这样的事情:

ModelName.where(attributes_hash).first_or_create

请参阅文档:http://apidock.com/rails/ActiveRecord/Relation/first_or_create