2014-11-14 28 views
0

所以我有一个对象,我想定义一个生命周期挂钩,如before_create,after_create等定义自定义对象生命周期的钩子红宝石

我想打电话给这个after_retire并将它安装,所以我可以做以下:

class User < ActiveRecord::Base 
    include Active 
    after_retire :method 

    def method 
    #do stuff 
    end 
end 

到目前为止,我有一个模块的设置,像这样,但我不断收到一个未定义的方法在我的用户模型after_retire错误。

module Active 
    extend ActiveSupport::Concern 

    included do 
    define_callbacks :retire 
    set_callback :retire, :after, :after_retire 
    default_scope { where(:retired => false) } 
    scope :retired, where(:retired => true) 
    end 

    def retire! 
    run_callbacks :retire do 
     update_attribute :retired, true 
     update_attribute :retired_at, Time.now.to_datetime 
    end 
    end 
end 

我该如何设置它?

回答

1

before/after_callback语法通过#define_model_callbacks在ActiveModel :: Callbacks中处理。原始的ActiveSupport ::回调会要求您使用#set_callback没有任何语法糖:

module Active 
    extend ActiveSupport::Concern 

    included do 
    define_callbacks :retire 
    default_scope { where(:retired => false) } 
    scope :retired, where(:retired => true) 
    end 

    def retire! 
    run_callbacks :retire do 
     update_attribute :retired, true 
     update_attribute :retired_at, Time.now.to_datetime 
    end 
    end 
end 

class User < ActiveRecord::Base 
    include Active 
    set_callback :retire, :after, :method 

    def method 
    #do stuff 
    end 
end 

如果你想有后/语法之前,因为你是用一个ActiveRecord工作(并因此加载ActiveModel)类,您可以使用:

module Active 
    extend ActiveSupport::Concern 

    included do 
    define_model_callbacks :retire 
    default_scope { where(:retired => false) } 
    scope :retired, where(:retired => true) 
    end 

    def retire! 
    run_callbacks :retire do 
     update_attribute :retired, true 
     update_attribute :retired_at, Time.now.to_datetime 
    end 
    end 
end 

class User < ActiveRecord::Base 
    include Active 
    after_retire :method 

    def method 
    #do stuff 
    end 
end 
+1

此外,您应该使用update_attributes(retired:true,retired_at:Time.now)以避免不必要的额外数据库调用。 – 2014-11-14 23:44:35