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 が返されますが、更新が保存されていないため、db がロールバックされていると思います。

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 に答える