2010-10-15 20 views
1

J'ai utilisé un modèle de mon application en tant que proxy pour d'autres objets qui définissent le comportement.Objets proxy avec des modèles ActiveRecord - method_missing ne fonctionne pas parfois

class Box < ActiveRecord::Base 

    belongs_to :box_behavior, :polymorphic => true, :validate => true, :foreign_key => 'box_behavior_id', :dependent => :destroy 

    [...] 

    def initialize(opts = {}) 
    super(opts) 
    self.box_behavior = BoxBehaviorDefault.new if self.box_behavior.blank? 
    end 

    private 
    def method_missing(method, *args, &block) 
     super 
     rescue NoMethodError 
     return self.box_behavior.send(method,*args,&block) 
    end 
end 

Je mettre en œuvre toutes les méthodes sur mes objets BoxBehavior, et quand je l'appelle une méthode sur une instance de boîte il redirige l'appel vers l'objet boxbehavior associé. Tout fonctionne très bien, sauf quand j'ai essayé de créer un crochet sur mon modèle d'achat où il obtient le total de son objet boîte et l'enregistre:

class Purchase < ActiveRecord::Base 

    belongs_to :box 

    before_validation_on_create { |r| r.total = r.box.total } 
end 

Lorsque je tente de sauver un objet d'achat qui a une boîte associée, J'obtiens cette erreur:

undefined method `total' for #<ActiveRecord::Associations::BelongsToAssociation:0x7fe944320390> 

Et je n'ai pas la moindre idée sur ce qu'il faut faire ensuite ... Quand je mets en œuvre la méthode totale directement dans la classe de boîte il fonctionne très bien ... que puis-je faire résoudre cela? Le proxy ne fonctionne pas correctement?

Répondre

1

J'ai découvert que Rails n'utilisait pas toujours initialize pour créer une nouvelle instance d'un modèle. J'ai donc utilisé le hook after_initialize et résolu le problème!