我有以下類別:紅寶石元編程問:調用外部類的方法after_save的
class AwardBase
class AwardOne < AwardBase
class Post < ActiveRecord::Base
崗位是一個ActiveRecord,而獎有can_award?類方法需要一個post對象並檢查它是否符合某些條件。如果是,它會更新post.owner.awards。
我知道我可以使用觀察者模式來做到這一點(我測試了它,代碼工作正常)。但是,這需要我爲該模型添加額外的代碼。如果可能的話,我不想觸摸模型。我希望做的是運行大獎支票像這樣(觸發器將在類加載時被調用):
class AwardOne < AwardBase
trigger :post, :after_save
def self.can_award?(post)
...
end
end
與上面的代碼的目的是,它會自動添加AwardOne.can_award?到郵政after_save的方法
所以基本上我想要做的是讓trigger
呼叫相當於:
class Post < ActiveRecord::Base
after_save AwardOne.can_award?(self)
...
end
這基本上是:
class Post < ActiveRecord::Base
after_save :check_award
def check_award
AwardOne.can_award?(self)
end
end
哪有我這樣做而不修改Post類?
這裏是我做了(這似乎不工作):
class AwardBase
def self.trigger (klass, active_record_event)
model_class = klass.to_class
this = self
model_class.instance_eval do
def award_callback
this.can_award?(self)
end
end
model_class.class_eval do
self.send(active_record_event, :award_callback)
end
end
def self.can_award? (model)
raise NotImplementedError
end
end
上面的代碼失敗,出現錯誤:
NameError (undefined local variable or method `award_callback' for #<Post:0x002b57c04d52e0>):
請提供此錯誤的堆棧跟蹤。 –
您可以使用ActiveSupport :: Concerns,與此處接受的答案類似:http://stackoverflow.com/questions/12084234/how-do-i-use-ruby-metaprogramming-to-add-callbacks-toa-a- rails-model?rq = 1 – Anand
但你仍然需要將它包含在你的模型中!我不太確定 – argentum47