18

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

(没有打印任何内容)。有没有办法让块在这两种情况下都运行?

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

ETC

于 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 回答