2016-04-03 84 views
0

我试图在使用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的最佳方法是什么?

回答

2

我建议在创建时使用after_validation回调而不是after_commit。您将调用多个交易,这不是此回调的意图。我会做的是这样的:

after_validation(on: :create) do 
    self.slug = generate_slug 
end 

还要确保在generate_slug里面没有保存动作。该方法应该简单地返回一个值来插入slug属性。

+0

我thnk这两种方法和@lei_liu工作。任何想法是更好的方法使用? – Lorenz

+0

取决于您是否需要在创建段塞之前将数据保存在磁盘中。当我读取你的代码时,我假定发生了一些事情,需要在生成slug之前创建数据,就像数据库交互在某处创建静态路由一样,或者发送一封电子邮件,如果数据未被持久化在生成slu before之前。如果你没有根据数据库中的数据做一些生成slug的工作,那么只有对数据库进行单一事务(我的建议),性能会更好。 –

+0

[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。 –

0

使用不会触发回调等的方法:update_column

def create_slug 
    update_column('slug ', generate_slug) 
end 
相关问题