4

既存のレコードを検索したり、新しいレコードを作成して後続のコードブロックを実行したりできるRailsメソッドを知っている人はいますか?

例:

Model.where(parameters).first_or_create do |m|
  # execute this regardless of whether record exists or not
end

同様に、このメソッドfind_or_create_byはどちらのシナリオでもブロックを実行しません。

ステートメントを使用することもできますif-elseが、コードが重複します...

4

3 に答える 3

21

私はライアンベイツによる素晴らしいスクリーンキャストからこれを拾いました :

Model.where(parameters).first_or_create.tap do |m|
  # execute this regardless of whether record exists or not
end

User#tapユーザーを選択する場所)この方法は少しすっきりしているように見えると思います。Mischaの答えのように別のヘルパーメソッドを定義する必要はありません。ただし、どちらも正常に機能します。

于 2012-11-05T08:49:40.533 に答える
7

APIによると、この例のブロックは、レコードが存在しない場合にのみ実行されます。ただし、ブロックもif-elseも必要ありません。

m = Model.where(parameters).first_or_create
m.some_method # executes regardless of whether record exists or not

オブジェクトの一部の検証が失敗したためm、データベースにまだ保持されていない可能性があることに注意してください。

于 2012-09-04T01:27:58.397 に答える
0

@ericブロックを閉じる前にデータを保存する必要があります。

Model.where(parameters).first_or_create.tap do |m|
   # execute this regardless of whether record exists or not

   m.save
end
于 2020-02-17T08:24:34.630 に答える