first_or_initialize调用块,即使找到了行

时间:2015-05-04 08:12:11

标签: ruby-on-rails ruby activerecord

在我的一个模特中,我正在打电话

puts where(field: value).first
where(field: value).first_or_initialize.tap do |row|
      # . . . Actual creation and saving omitted
end

我已经运行了几次只是为了测试它,即使我可以清楚地看到它不应该是(因为puts正在打印找到的行并且因为有实际上是数据库中的东西)。我也知道正在调用该块,因为我在那里省略了puts并且SQL正在调用更新。

这是为什么?我该如何解决?

1 个答案:

答案 0 :(得分:2)

您需要了解tap的工作原理。关键在于,tap基本上,您可以点击对象并在其上操作块。在这种情况下,您根本不需要tap。这就是你需要的:

Model.where(conditions).first_or_initialize do |row|
  # code
end

或多或少,相同的代码,但没有tap