Rails find_or_create_by在查找案例中哪些块运行?

Sim*_*ide 13 activerecord ruby-on-rails dynamic-finders

ActiveRecord find_or_create_by动态查找器方法允许我指定一个块.文档对此并不清楚,但似乎该块仅在创建案例中运行,而不在查找案例中运行.换句话说,如果找到记录,则该块不会运行.我用这个控制台代码测试了它:

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

(没有打印).在这两种情况下都有办法让块运行吗?

fl0*_*00r 23

据我所知,如果没有找到,将执行块.用例看起来像这样:

User.find_or_create_by_name("Pedro") do |u|
  u.money = 0
  u.country = "Mexico"
  puts "User is created"
end
Run Code Online (Sandbox Code Playgroud)

如果找不到用户,它将初始化名为"Pedro"的新用户以及块内的所有这些内容,并将返回新创建的用户.如果用户存在,它将返回该用户而不执行该块.

您还可以使用"块样式"等其他方法:

User.create do |u|
  u.name = "Pedro"
  u.money = 1000
end
Run Code Online (Sandbox Code Playgroud)

它会做同样的事情,User.create( :name => "Pedro", :money => 1000 )但看起来好一点

User.find(19) do |u|
  ..
end
Run Code Online (Sandbox Code Playgroud)

等等


dei*_*vid 9

在我看来,这个问题实际上并没有得到回答,所以我愿意.这是最简单的方法,我认为,你可以实现这一点:

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
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 您已经使用了“tap”,它将返回“find_or...”的结果,因此实际上并不是将块传递到 find 中,而是传递到 tap 中! (2认同)