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