Pregunta

Bien, estoy totalmente perplejo en este caso. Estoy tratando de construir un menú de páginas web publicadas organizados por categorías.

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 filtro 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')

En general, esto vuelve lo que necesito, pero no sin categorías padre páginas publicadas. Por ejemplo, funciona muy bien si tengo:

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

Cuando se produce un error es cuando no tengo las páginas publicadas en el padre, como esto:

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

Gracias de antemano por cualquier ayuda en esto. Estoy tratando de aprender lo más que pueda acerca de 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, sino también consigo categorías padre vacías (no published_pages, hay categorías de niños 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.

¿Fue útil?

Solución

Añadir una nueva asociación llamada 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 está interesado en aprender qué su enfoque no ha funcionado, leer los rieles (scroll 10-15 líneas después de la sección Eager loading of associations). He incluido el fragmento relevante abajo:

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. 

Tenga en cuenta que utilizando condiciones como esto puede tener consecuencias no deseadas. En el ejemplo anterior no se devuelven los mensajes con comentarios aprobada noción en absoluto, ya que las condiciones se aplican a la instrucción SQL como un todo y no sólo a la asociación. Debe eliminar la ambigüedad de la columna referencias para este repliegue a ocurrir, por ejemplo: Para => "DESC author.name" funciona, pero:. Para => "Nombre DESC" no

Para ansiosos filas carga filtrada 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top