2009-03-28 4 views
5

Existe-t-il un moyen de charger un named_scope d'une association?Désireux de charger un named_scope à partir d'une association dans Rails

J'ai mon article modèle:

class Article < ActiveRecord::Base 
    has_many :comments 
end 

et mon modèle Commentaire:

class Comment < ActiveRecord::Base 
    belongs_to :article 

    named_scope :approved, :conditions => { :approved => true } 
    named_scope :unapproved, :conditions => { :approved => false } 
end 

je pouvais charge désireux tous les commentaires pour un article:

@article = Article.find(params[:id], :include => :comments) 

Comment puis-je faire la même chose, mais seulement pour les commentaires approuvés?

Répondre

3

Il n'est pas intégré aux rails à ce moment, mais Ryan Daigle a créé un plugin appelé utility_scopes qui ajoute un avec() portée afin que vous puissiez faire:

Article.approved.with(:comments) 

Blog Post: http://ryandaigle.com/articles/2008/8/20/named-scope-it-s-not-just-for-conditions-ya-know Github repo: http://github.com/yfactorial/utility_scopes

[Mis à jour par commentaire]

Mon mauvais. Je n'ai pas bien lu. Je ne pense pas qu'il y ait quoi que ce soit qui permette de faire appel à une association nommée scope_cope comme ça. La chose la plus proche que je peux penser serait de créer un named_scope sur l'article:

class Article < ActiveRecord::Base 
    named_scope :with_approved_comments, {:include => :comments, :conditions => ['comments.approved = ?', true]} 
end 

Espérons que cela aide.

+0

Si j'ai bien compris l'article du blog, cela me donnerait les articles avec tous leurs commentaires. C'est équivalent à: Article.approved.all (: include =>: comments). Ce que je cherchais, c'était de délimiter les commentaires, afin que chaque article ne charge que ses commentaires approuvés, pas tous. –

1

L'autre réponse n'a pas fonctionné pour moi puisque je dois charger de nombreuses associations et associations de ces associations sur certains modèles. J'ai trouvé que j'avais deux options, changer l'association pour avoir des conditions et ainsi faire une association pour chaque portée que je voulais ou les transformer en méthodes sur la classe qui avait l'association has_many. Je devais faire quelque chose le long des lignes de:

@newspaper = Newspaper.find params[:id], :include => { 
    :articles => { 
    :author => true, 
    :source => true 
    } 
} 

Donc, dans mon exemple, je changé:

class Newspaper < ActiveRecord::Base 
    has_many :articles 
end 

class Article 
    belongs_to :newspaper 
    belongs_to :author 
    has_one :source 

    named_scope :private, :conditions => { :private => true } 
    named_scope :public, :conditions => { :private => false } 
end 

à:

class Newspaper < ActiveRecord::Base 
    has_many :articles 

    def articles_public 
    articles.reject &:private 
    end 

    def articles_private 
    articles.select &:private 
    end 
end 

class Article 
    belongs_to :newspaper 
    belongs_to :author 
    has_one :source 
end 

J'ai trouvé cette façon d'être préférable, car je peux maintenant impatients de charger des articles lors de la recherche d'un journal et de changer tout article.private en article_private. Si je l'avais créé deux associations comme:

has_many :articles_private, :class_name => 'Article', :conditions {:private => true} 
has_many :articles_public, :class_name => 'Article', :conditions {:private => false} 

je dois charge les deux hâte dans les cas où je devais tous les articles associés.

Questions connexes