ActiveRecord find_or_create_by 动态查找器方法允许我指定一个块。文档对此并不清楚,但似乎该块仅在 create 情况下运行,而不在 find 情况下运行。换句话说,如果找到记录,则该块不会运行。我用这个控制台代码测试了它:
User.find_or_create_by_name("An Existing Name") do |u|
puts "I'M IN THE BLOCK"
end
(没有打印任何内容)。有没有办法让块在这两种情况下都运行?
ActiveRecord find_or_create_by 动态查找器方法允许我指定一个块。文档对此并不清楚,但似乎该块仅在 create 情况下运行,而不在 find 情况下运行。换句话说,如果找到记录,则该块不会运行。我用这个控制台代码测试了它:
User.find_or_create_by_name("An Existing Name") do |u|
puts "I'M IN THE BLOCK"
end
(没有打印任何内容)。有没有办法让块在这两种情况下都运行?
据我了解,如果没有找到,将执行块。它的用例如下所示:
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
ETC
在我看来,这个问题实际上并没有得到回答,所以我会的。我认为这是最简单的方法,您可以实现:
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
干杯!