18

ActiveRecord find_or_create_by動的ファインダーメソッドを使用すると、ブロックを指定できます。ドキュメントはこれについて明確ではありませんが、ブロックは作成の場合にのみ実行され、検索の場合には実行されないようです。つまり、レコードが見つかった場合、ブロックは実行されません。私はこのコンソールコードでそれをテストしました:

User.find_or_create_by_name("An Existing Name") do |u|
  puts "I'M IN THE BLOCK"
end

(何も印刷されませんでした)。どちらの場合もブロックを実行する方法はありますか?

4

2 に答える 2

27

私が理解している限り、何も見つからない場合はブロックが実行されます。そのユースケースは次のようになります。

User.find_or_create_by_name("Pedro") do |u|
  u.money = 0
  u.country = "Mexico"
  puts "User is created"
end

ユーザーが見つからない場合は、「Pedro」という名前の新しいユーザーとブロック内のこれらすべてのものが初期化され、新しく作成されたユーザーが返されます。ユーザーが存在する場合は、ブロックを実行せずにこのユーザーを返すだけです。

また、次のような「ブロックスタイル」の他の方法を使用することもできます。

User.create do |u|
  u.name = "Pedro"
  u.money = 1000
end

と同じように動作しますUser.create( :name => "Pedro", :money => 1000 )が、少し見栄えがします

User.find(19) do |u|
  ..
end

于 2011-03-28T15:45:44.890 に答える
12

この質問が実際に答えられているようには思えないので、そうします。これが最も簡単な方法だと思います。次のことを実現できます。

User.find_or_create_by_name("An Existing Name or Non Existing Name").tap do |u|
  puts "I'M IN THE BLOCK REGARDLESS OF THE NAME'S EXISTENCE"
end

乾杯!

于 2014-03-12T10:33:28.913 に答える