4

任何人都知道 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语句,但这会重复我的代码......

4

3 回答 3

21

我是从 ryan bates的精彩截屏中摘录的:

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

User#tap选择用户的地方)我认为这种方式看起来更干净一些,您不必像米沙的回答那样定义另一个帮助方法。两者都工作正常。

于 2012-11-05T08:49:40.533 回答
7

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

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

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

于 2012-09-04T01:27:58.397 回答
0

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

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

   m.save
end
于 2020-02-17T08:24:34.630 回答