2010-09-05 14 views
9

Estamos planeando actualizar nuestra aplicación a Rails3. Un complemento que hemos usado bastante es nestted_has_many_through. Este complemento parece obsoleto, y ya no se mantiene, y simplemente no parece estar funcionando en una nueva aplicación Rails3.Rails3 anidados has_many a través de la pregunta

Un ejemplo sencillo:

Author.rb 
has_many :posts 
has_many :categories, :through => :posts, :uniq => true 
has_many :related_posts, :through => :categories 

Post.rb 
belongs_to :author 
belongs_to :category 

Category.rb 
has_many :posts 

¿Alguien puede recomendar la mejor manera práctica para manejar esto, o un plugin Rails3 de trabajo?

Gracias!

+1

Haha Acabo de encontrar su fork http://github.com/releod/nested_has_many_thr Recordé esta pregunta y vine a contarle todo sobre el tenedor. Y luego vi su nombre de usuario. Buen trabajo, acabo de probar esto en mi aplicación Rails 3 y funciona (principalmente). He pasado toda la noche intentando parchar Rails directamente según https://rails.lighthouseapp.com/projects/8994/tickets/1152-support-for-nested-has_many-through-associations pero me he quedado atascado. Empezaré con tu tenedor como plantilla, ¡y podría llegar más lejos ahora! –

+0

+1 http://github.com/releod/nested_has_many_through su fork de rails3 también funciona para mí, lo usaré hasta los rieles 3.1 – clyfe

Respuesta

0

Estoy más confundido por la parte has_many: related_posts. ¿Estás tratando de unir esencialmente las publicaciones clasificadas? Al igual, ¿todas las publicaciones en la categoría 'x' se consideran 'relacionadas'? Si es así, esto no funcionará en base a no ser una clase RelatedPost, por lo que para solucionar este problema en un mínimo, tendría que especificar: class_name sobre la asociación:

has_many :related_posts, :class_name => 'Post', :through => :categories 

Pero en segundo lugar, es probable que sea no es el enfoque correcto para empezar. Como cualquier autor ya tiene muchas publicaciones a través de la clave externa author_id, no tiene sentido tratar de avanzar a través de la tabla de categorías, en su lugar usa la lógica de agrupación.

enfoques alternativos que limpiar esto:

Author.rb

has_many :posts do 
    def related 
    all.group_by(&:category_id) 
    end 
end 
author.posts.related 
=> OrderedHash 

Por supuesto, todo esto es discutible si no era lo que estaba tratando de lograr. : P

+2

Me inclino a pensar que su ejemplo es artificial (por lo tanto, es fácilmente defectuoso). Su pregunta sigue siendo fundamentalmente importante. Y a mi leal saber y entender, NO hay una solución funcional para anidados que tenga muchos problemas en Rails 3 (a la vieja jerarquía anidada por Rails <2.3) –

+0

La última parte de su pregunta mencionó "recomendar la mejor práctica". Mi punto era, si su aplicación lo requiere, probablemente haya un mejor mecanismo para lograrlo. ;) Si su ejemplo es realmente artificial, sería increíblemente útil ver su código real. – jenjenut233

+1

Bastante justo. Definitivamente hay casos de uso en los que un anidado tiene muchas asociaciones (es decir, el uso de varias UNIONES INTERIORES, para personas que no usan Rails) es una solución válida, y a menudo la mejor. Dado "Autor - - suscriptores> -

0

Rails 3 (no probados, órdenes por postes con categorías más afines primeros):

category.rb:

class Category < ActiveRecord::Base 
    class << self 
    def posts 
     Post.joins(:categories). 
      where(:categories => select('id').all.map(&:id)). 
      group('posts.id'). 
      order('count(*) DESC') 
    end 
    end 
end 

Uso:

related_posts = author.categories.posts 
Cuestiones relacionadas