2009-03-28 9 views
5

¿Hay alguna forma de cargar un named_scope desde una asociación?Ansioso de cargar un named_scope desde una asociación en Rails

tengo mi modelo artículo:

class Article < ActiveRecord::Base 
    has_many :comments 
end 

y mi comentario modelo:

class Comment < ActiveRecord::Base 
    belongs_to :article 

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

que puede mostrarse ansiosos todos los comentarios de un artículo con:

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

¿Cómo puedo hacer lo mismo, pero solo para comentarios aprobados?

Respuesta

3

No está integrado en los carriles en este momento, pero Ryan Daigle creado un plugin llamado utility_scopes que se suma a con() alcance por lo que puede hacer:

Article.approved.with(:comments) 

en blog: 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

[Actualizado por comentario]

Mi mal. No leí lo suficientemente bien. No creo que haya nada que te permita recurrir a una asociación llamada_scope como esa. Lo más parecido que puedo pensar sería crear un named_scope en Article:

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

Espero que esto ayude.

+0

Si entendí la publicación del blog correctamente, eso me daría los artículos de alcance con todos sus comentarios. Es equivalente a: Article.approved.all (: include =>: comments). Lo que estaba buscando era analizar los comentarios, de modo que cada artículo solo muestra sus comentarios aprobados, no todos. –

1

La otra respuesta no funcionó para mí ya que tengo que cargar muchas asociaciones y asociaciones de esas asociaciones en algunos modelos. Encontré que tenía dos opciones, cambiar la asociación para tener condiciones y así hacer una asociación para cada alcance que quería o convertirlos en métodos en la clase que tenía la asociación has_many. Que tenía que hacer algo en la línea de:

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

Así que en mi ejemplo he cambiado:

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 

a:

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 

he encontrado de esta manera que es preferible ya que puede ahora ansioso de cargar artículos cuando encuentre un periódico y simplemente cambie todo el artículo. privado a article_private. Si hubiera creado dos asociaciones como:

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

tendría que carga con ganas a ambos en los casos en que necesitaba todos los artículos asociados.

Cuestiones relacionadas