2010-11-16 14 views
10

De acuerdo, estoy completamente perplejo en este caso. Intento crear un menú de páginas web publicadas organizadas por categoría.Rieles 3 - Ansioso de cargar con las condiciones

Category.rb:

belongs_to :parent, :class_name => "Category", :foreign_key => "parent_id" 
has_many :children, :class_name => "Category", :foreign_key => "parent_id" 
has_many :pages, :documents, :galleries 

Page.rb

belongs_to :category 

El modelo también ha Página: is_published, por lo que estoy tratando de filtrar en eso también. Soy reacio a publicar mis intentos de consulta débiles, pero no ven otra solución que mendigar la gente mucho más inteligente:

(auto es @current_website)

self.categories.includes(:children, :pages).where('pages.is_published = 1') 

Esto devuelve sobre todo lo que necesito, pero no los padres Categorías sin páginas publicadas Por ejemplo, funciona muy bien si tengo:

Parent Category 
- Published Page 
- Child Category 
-- Published Page 

donde falla es cuando no tengo las páginas publicadas en el padre, así:

Parent Category 
- Child Category 
-- Published Page 
- Child Category 
-- Published Page 

Gracias de antemano por cualquier ayuda en esto. Estoy tratando de aprender todo lo que puedo sobre las consultas, pero estoy contra la pared en esto.

ACTUALIZACIÓN: La sugerencia de Ejecución KandadaBoggu ha dado resultados mucho mejores, esto se añadió a Category.rb

has_many :published_pages, :class_name => "Page", 
          :conditions => {:is_published => true} 

Sin embargo, cuando se usa el siguiente:

self.categories.where(:parent_id => nil).includes({:children => :published_pages}, 
                :published_pages) 

consigo los resultados que necesito, pero también obtengo Categorías padre vacías (sin páginas_publicadas, sin categorías secundarias con páginas publicadas. Un ejemplo:

- Parent Category 
-- Published Page 
- Parent Category 
-- NOTHING 

Mi arreglo temporal fue anexado a la consulta con:

reject{|category| category.pages.empty? && category.children.empty?} 

Gracias de nuevo por su ayuda.

Respuesta

14

añadir una nueva asociación denominada published_pages (aparte de sus asociaciones actuales)

class Category 

    has_many :children,  :class_name => "Category", 
       :foreign_key => "parent_id" 
    has_many :published_pages, :class_name => "Page", 
       :conditions => { :is_published => true } 

end 

Ahora usted puede conseguir todas las categorías de la siguiente manera:

self.categories.includes(:children, :published_pages) 

Si usted está interesado en aprender qué su enfoque no funcionó, lea los rieles documentation (desplazarse 10-15 líneas después de la sección Eager loading of associations).He incluido el fragmento correspondiente a continuación:

Por ejemplo

Post.includes([:author, :comments]).where(['comments.approved = ?', true]).all 

Esto resultará en una sola consulta SQL y se une a lo largo de las líneas de:

LEFT OUTER JOIN comments ON comments.post_id = posts.id and 
LEFT OUTER JOIN authors ON authors.id = posts.author_id. 

en cuenta que el uso de condiciones como esto puede tener consecuencias no deseadas. En el ejemplo anterior, las publicaciones con comentarios aprobados por la noción no se devuelven en absoluto, porque las condiciones se aplican a la instrucción SQL como un todo y no solo a la asociación. Debe eliminar la ambigüedad de las referencias de la columna para que se produzca esta alternativa, por ejemplo: order => "author.name DESC" funcionará pero: order => "name DESC" no lo hará.

Para filas carga filtrada deseosos de una asociación, utilice una asociación con condiciones:

class Post < ActiveRecord::Base 
    has_many :approved_comments, :class_name => 'Comment', 
      :conditions => ['approved = ?', true] 
end 

Post.find(:all, :include => :approved_comments) 
+0

Gracias por la más excelente reportaje, enlace y explicación, KandadaBoggu! Esto ciertamente me ha puesto en el camino correcto, todavía tengo un problema con self.categories.includes (: children =>: published_pages,: published_pages) que entrega padres sin páginas o categorías de niños con páginas. ¡GRACIAS DE NUEVO! – TMB

+0

Actualice su pregunta y especifique su requisito w.r.t a presencia/ausencia de páginas. –

+0

Fantasicamente útil gracias, me sacaba el pelo – jpwynn

Cuestiones relacionadas