2010-07-06 2 views
0

J'ai 2 modèles Widget et Feature qui ont un à travers l'association à l'aide du modèle WidgetFeature.Scopes avec de nombreux par l'intermédiaire de l'association

class Widget < ActiveRecord::Base 
    has_many :widget_features 
    has_many :features, :through => :widget_features 
    end 

    class WidgetFeature < ActiveRecord::Base 
    belongs_to :feature 
    belongs_to :widget 
    attr_accessible :children_features, :widget_id, :feature_id 
    end 

class WidgetFeature < ActiveRecord::Base 
    belongs_to :feature 
    belongs_to :widget 
    attr_accessible :children_features, :widget_id, :feature_id 
end 

J'ai un widget_id.

donc je ne Widget.find_by_id (WIDGET_ID)

Maintenant, je veux trouver toutes les fonctionnalités de ce widget où widget_features.children_features IS NULL. Je ne sais pas comment faire, aidez-moi.

+1

vous collez WidgetFeature deux fois s'il vous plaît fournir Feature Model – Salil

Répondre

0

J'ai travaillé sur named_scope et j'ai trouvé une solution élégante. Donc, je le poste ici afin que les autres coincés avec le même problème peuvent également obtenir de l'aide. Ma solution vous donne un moyen d'accéder à n'importe quelle colonne du modèle de jointure dans l'association has many through.

est ici la solution pour mon problème ci-dessus: vous

class Widget < ActiveRecord::Base 
    has_many :widget_features 
    has_many :features, :through => :widget_features 

    def leaf_features 
    widget_features.leaf_features.map{|widget_feature|widget_feature.feature} 
    end 
end 

class WidgetFeature < ActiveRecord::Base 
    named_scope :leaf_features, :conditions => 'children_features IS NULL' 
    belongs_to :feature 
    belongs_to :widget 
    attr_accessible :children_features, :widget_id, :feature_id 
end 

Maintenant, Widget.find_by_id(widget_id).leaf_features donnera uniquement les fonctions où children_features column is NULL.

0

Essayez

@widget = Widget.find_by_id(widget_id) 
@features = @widget.features.conditions("widget_features.children_features IS nil") 

ÉDITÉ

Ref this

has_many :features, :through => :widget_features, :conditions=>["widget_features.children_features is nil"] 

puis

@widget = Widget.find_by_id(widget_id) 
@features = @widget.features 
+0

Cela ne fonctionne pas. Je reçois une erreur la méthode non définie 'conditions 'pour # ce qui signifie que les conditions ne sont pas une méthode. –

+0

@Jatin: - vérifier ma réponse éditée. – Salil

+1

- Cela ne fonctionne toujours pas et me donne une erreur SQL. Mysql :: Erreur: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel correspondant à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'nil)))' à la ligne 1: SELECT 'features'. * FROM' features' INNER JOIN 'widget_features' ON' features'.id = ' widget_features'.feature_id WHERE (('widget_features'.widget_id = 1) ET ((widget_features.children_features est nul))) –

0
Feature.all(:joins => :widget_features, :conditions => ["widget_id = ? and children_features is null", some_id]) 
+0

pour les points bonus, utilisez un named_scope –

Questions connexes