4

エラーなしで正常に動作する次のコードがありますが、モデルは保存されません...

myarray.each do |item|

    r = MyModel.unscoped.where(:site_id => @site.id, :url => item['permalink_url']).first_or_initialize do |r|
        r.title              = 'asdasdadaddjfgnfd'
        r.save!
    end
end

モデルを検索しようとすると、ターミナルに SQL SELECT ステートメントが表示されますが、UPDATE/INSERT ステートメントは実行されません。

ここで何が欠けていますか?

4

3 に答える 3

8

Railsfirst_or_*メソッドは、渡されたブロックのみinitializeまたはcreate一部を呼び出します。レコードが見つかった場合、メソッドはそれを返すだけなので、渡されたブロックは決して実行されません。ソースを確認する

したがって、メソッド内でブロックを使用できるのはfirst_or_*、既存のアイテムを更新するためではなく、新しいアイテムを初期化するためだけです。ほとんどの場合、そのような状態のレコードが存在し、更新されません。

次のような更新コードを移動してみてください

myarray.each do |item|

  r = MyModel.unscoped.where(:site_id => @site.id, :url => item['permalink_url']).first_or_initialize
  r.title              = 'asdasdadaddjfgnfd'
  r.save!

end
于 2013-08-23T18:18:14.160 に答える
3

を探していfirst_or_createます。first_or_initializeオブジェクトを初期化するだけです(保存の準備をするためかもしれませんが、そうする必要はありません)。

既存のコードは次のように機能する可能性があります。

r = MyModel.unscoped.where(:site_id => @site.id, :url => item['permalink_url']).first_or_initialize do |r|
    r.title              = 'asdasdadaddjfgnfd'
end

r.save!
于 2013-08-23T17:45:10.173 に答える