有人知道一个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
语句,但这会复制我的代码......
答案 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