Rails find_or_create_by在查找案例中块运行的位置?

时间:2011-03-28 15:30:29

标签: ruby-on-rails activerecord 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

(没有打印)。有没有办法在两种情况下运行块?

2 个答案:

答案 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

干杯!