2010-11-26 3 views
2

Je suis mise à niveau d'un rail 2.3 application aux rails 3.0.3Mise à niveau vers Rails 3, extensions d'association has_many ne fonctionne plus avec les étendues

je les extensions d'association suivantes et étendues sur mon Product modèle

has_many :related_products, :through => :product_related_products do 
    [:alternative, :complement, :bigger_pack, :higher_quantity, :lower_quality].each do |meth| 
    define_method(meth) { 
     find :all, :conditions => ["product_related_products.#{meth} = ?", true] } 
    end 
end 

scope :visible, where(:hidden => false) 

le concept tiré de: http://guides.rubyonrails.org/association_basics.html#association-extensions

Quand j'appelle l'association dans une chaîne

@product.related_products.visible.alternative 

Il fonctionne très bien dans des rails 2.3, je reçois l'erreur suivante dans Rails 3:

undefined method `alternative' for #<ActiveRecord::Relation:0x1047ef978> 

activerecord (3.0.3) lib/active_record/relation.rb:371:in `method_missing' 
app/views/products/show.html.haml:18:in `_app_views_products_show_html_haml___1131941434_2185376080_0' 

Je suppose que ses quelque chose à voir avec la nouvelle relation qui est créé, mais je ne suis pas sûr de savoir comment procéder, le guide des rails suggère toujours que cette méthode est correcte.

// modifier après que les modifications proposées par François:

Les définitions de classe sont les suivantes:

class Product < ActiveRecord::Base 
    has_many :product_related_products 
    has_many :related_products, :through => :product_related_products 
end 

class ProductRelatedProduct < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :related_product, :class_name => "Product" 

    scope :with_attribute, lambda {|attr| where(attr, true)} 

end 


@product.related_products.with_attribute(:alternative) raises: 

NoMethodError Exception: undefined method `with_attribute' for #<Class:0x108fbd8b8> 

Répondre

0

Définir vos champs d'application dans la classe associée:

class RelatedProduct < ActiveRecord::Base 

    scope :visible, where(:hidden, false) 

    %w(alternative complement bigger_pack higher_quantity lower_quality).each do |attribute| 
    scope attribute, where(attribute, true) 
    end 

end 

@product.related_products.visible.bigger_pack 

Vous pouvez également créer un méthode qui s'attendre à l'attribut que vous recherchez:

class RelatedProduct < ActiveRecord::Base 
    scope :with_attribute, lambda {|attr| where(attr, true)} 
end 

@product.related_products.visible.with_attribute(:bigger_pack) 
+0

Merci pour votre réponse, cependant, aucune solution ne fonctionne. – Rob

+0

Je reçois les erreurs suivantes # 1 NoMethodError Exception: méthode non définie with_attribute 'pour # # 2 NoMethodError Exception: méthode non définie alternative' pour # Rob

+0

J'ai mis à jour la question d'inclure les classes après vos suggestions – Rob

Questions connexes