在使用after_commit回调创建对象后,我尝试为对象生成一个唯一的slug。
after_commit :create_slug, on: :create
def create_slug
self.slug = generate_slug
self.save
end
当我尝试保存对象时,我会得到一个太深的"堆栈级别"错误。我假设是因为我保存了对象并且它一次又一次地调用了after_commit回调。
在这种情况下,生成和保存独特slu g的最佳方法是什么?
答案 0 :(得分:2)
我建议在create而不是after_commit上使用after_validation回调。您将调用多个事务,这不是此回调的意图。我要做的是:
after_validation(on: :create) do
self.slug = generate_slug
end
还要确保generate_slug内没有保存操作。该方法应该只返回一个值以插入slug属性。
答案 1 :(得分:0)
使用不会触发回调的方法,例如:update_column
def create_slug
update_column('slug ', generate_slug)
end