2011-05-20 20 views
12

Tengo algunos problemas con has_one, through => model. Lo mejor es mostrarte mi caso.has_one,: through => modelo VS método simple?

class Category 
    has_many :articles 
end 

class Article 
    has_many :comments 
    belongs_to :category 
end 

class Comment 
    belongs_to :article 
    has_one :category, :through => :articles 
end 

Everthing works fine. Puedo hacer comment.category. El problema es cuando creo un nuevo comentario y configuro su artículo, así que guardo el comentario para hacer que la asociación funcione. Ejemplo:

>> comment = Comment.new 
>> comment.article = Article.last 
>> comment.category 
    -> nil 
>> comment.article.category 
    -> the category 
>> comment.save 
>> comment.category 
    -> nil 
>> comment.reload 
>> comment.category 
    -> the category 

has_one, through => model de todos modos no se estableció, construir constructor y crear método. Entonces, quiero reemplazar mi modelo de comentarios por:

class Comment 
    belongs_to :article 
    def category 
    article.category 
    end 
end 

¿Te parece una buena idea?

+0

alguien? nadie tiene buenas opiniones? – Hartator

Respuesta

6

No hay nada malo con su idea. No puedo ver muchas situaciones en las que has_one :category, :through => :articles sería la mejor opción obvia (a menos que esté ansioso de cargar con Comment.all(:include => :category)).

una pista sobre delegate:

class Comment 
    belongs_to :article 
    delegate :category, :to => :article 

Un enfoque diferente:

class Comment 
    belongs_to :article 
    has_one :category, :through => :article 

    def category_with_delegation 
    new_record? ? article.try(:category) : category_without_delegation 
    end 

    alias_method_chain :category, :delegation 
+0

un poco más de información para 'alias_method_chain' se puede encontrar [aquí] (http://yehudakatz.com/2009/03/06/alias_method_chain-in-models/) – jigfox

+0

ok buena información, renunciar a mi recompensa para usted. – Hartator

+0

Siento que esto es lo que Rails debería hacer por defecto ... ¡En lugar de simplemente consultar siempre la base de datos, revise el objeto que ya está en la memoria! – pdobb

2

intenta realizar cambios en su clase de Categoría de la siguiente manera:

class Category 
    has_many :articles 
    has_many :comments, :through => :articles 
end 
+0

lo siento, mal escrito en stakeoverflow. No es el problema en mi aplicación real. – Hartator