测试模型是否存在于回调中,如果它确实更新,否则创建

时间:2013-03-12 09:58:15

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-3.1

我有一个名为Product的模型。

p = Product.new(...) and p.save

我想要完成以下内容:

如果有其他产品具有相同的ID(不是pk),那么我们会更新产品,否则我们会创建一个新产品。

我认为这可以在before_save回调中完成!?

我试过这样的

before_save :try, on: :create

def try
   p = Product.where(id: self.id).first
   p and p.update_attributes(...) and return false
   *1
end

* 1,此时,属性已更新,它返回false表示未创建新模型,但我认为数据库已回滚,因为未保存更新。

2 个答案:

答案 0 :(得分:3)

您可以使用find_or_create(或find_or_initialize仅初始化而不保存实例。

另外:我不会创建一个名为try的方法,因为它已经存在以尝试一个方法,如果它不存在则返回nil(而不是异常)。

例如:

Product.find_or_create(self.id)

答案 1 :(得分:1)

我会做upsert

尽管ActiveRecord中不存在此命令。 Here是一个让你实现这种行为的答案。