0

我有一个名为 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表示未创建新模型,但我认为数据库已回滚,因为未保存更新。

4

2 回答 2

3

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

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

例如:

Product.find_or_create(self.id)
于 2013-03-12T10:09:21.433 回答
1

我会做一个upsert.

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

于 2013-03-12T10:03:07.017 回答