No se puede unir a las tablas de autocombinaciones en Rails

Tengo 2 models

class Category < ActiveRecord::Base belongs_to :parent, :class_name => "Category" has_many :children, :class_name => "Category", :foreign_key => "parent_id" has_many :products attr_accessible :description, :title, :parent end class Product < ActiveRecord::Base belongs_to :category end 

En particular, Categoría tiene un elemento principal titulado "té" y este elemento tiene muchos elementos para niños: "té negro", "té blanco" …

Necesito seleccionar productos que pertenecen a una categoría para padres "té". Así es como estoy haciendo eso:

 Product.joins(:category=>:parent).where(:category=>{:parent=>{:id=>1}}).all 

Lanza una exception (no se puede formatear bien)

 Product Load (0.8ms) SELECT `products`.* FROM `products` INNER JOIN `categories` ON `categories`.`id` = `products`.`category_id` INNER JOIN `categories` `parents_categories` ON `parents_categories`.`id` = `categories`.`parent_id` WHERE `parent`.`id` = 1 ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'parent.id' in 'where clause': SELECT `products`.* FROM `products` INNER JOIN `categories` ON `categories`.`id` = `products`.`category_id` INNER JOIN `categories` `parents_categories` ON `parents_categories`.`id` = `categories`.`parent_id` WHERE `parent`.`id` = 1 

debido a la columna parent.id desconocida.

Obviamente, la consulta debería ser (funciona perfectamente):

  SELECT `products`.* FROM `products` INNER JOIN `categories` ON `categories`.`id` = `products`.`category_id` INNER JOIN `categories` as `parents_categories` ON `parents_categories`.`id` = `categories`.`parent_id` WHERE `parents_categories`.`id` = 1 

Incluso intenté

 Product.joins(:category=>:parent).where(:category.parent=>{:id=>1}).all 

y no ayudó

Por favor, tus pensamientos.

Si bien la operación de joins() aquí es bastante inteligente, la parte where() no es tan inteligente. AFAIK no sabe nada sobre las uniones y realmente solo convierte sus arguments en cadenas. Como tal, intente esto:

 Product.joins(:category=>:parent).where(:parents_categories=>{:id=>1}) 

Para evitar sangrar el nombre usado internamente por AR en su código, considere usar AREL para su consulta. Recientemente se han realizado excelentes transmisiones sobre este tema.