在Rails中,对两个条件执行block:first_or_create

时间:2012-09-03 23:39:51

标签: ruby-on-rails-3.2

有人知道一个Rails方法,它允许我查找现有记录或创建一个新记录并执行后续代码块吗?

示例:

Model.where(parameters).first_or_create do |m|
  # execute this regardless of whether record exists or not
end

类似地,方法find_or_create_by在任一场景中都不执行块。

我可以使用if-else语句,但这会复制我的代码......

3 个答案:

答案 0 :(得分:17)

我是从a great screencast通过ryan bates选择的:

Model.where(parameters).first_or_create.tap do |m|
  # execute this regardless of whether record exists or not
end

User#tap选择用户) 我认为这种方式看起来更清晰,你不必像Mischa的答案那样定义另一个辅助方法。两者都很好。

答案 1 :(得分:6)

根据API,示例中的块仅在记录不存在时才会执行。但是你不需要块,也不需要if-else:

m = Model.where(parameters).first_or_create
m.some_method # executes regardless of whether record exists or not

请注意,对象上的某些验证可能已失败,因此m可能尚未持久保存到数据库。

答案 2 :(得分:0)

@eric,您需要在关闭块之前保存数据。

Model.where(parameters).first_or_create.tap do |m|
   # execute this regardless of whether record exists or not

   m.save
end