我试图在使用after_commit回调创建对象之后为对象生成一个独特的slu slu。在rails中创建活动记录对象之后产生一个slu 012
after_commit :create_slug, on: :create
def create_slug
self.slug = generate_slug
self.save
end
当我尝试保存该对象时,出现“堆栈级别过深”错误。我假设,因为我保存对象,它一次又一次地被称为after_commit回调。
在这种情况下生成和保存独特的slu What的最佳方法是什么?
我thnk这两种方法和@lei_liu工作。任何想法是更好的方法使用? – Lorenz
取决于您是否需要在创建段塞之前将数据保存在磁盘中。当我读取你的代码时,我假定发生了一些事情,需要在生成slug之前创建数据,就像数据库交互在某处创建静态路由一样,或者发送一封电子邮件,如果数据未被持久化在生成slu before之前。如果你没有根据数据库中的数据做一些生成slug的工作,那么只有对数据库进行单一事务(我的建议),性能会更好。 –
[bkoski/slug](https://github.com/bkoski/slug/blob/master/lib/slug/slug.rb#L32)创建slu uses时使用'before_validation'回调。 [FriendlyId/friendly_id](https://github.com/norman/friendly_id/blob/8069fc9959215e5f4872927928b3b7a95e9beacd/lib/friendly_id/slugged.rb#L250)使用'before_validation'将slug和'after_validation'设置为unset_if_invalid。 –