0

私は2つのモデルを持っています

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

特に、Categoryには「tea」という親アイテムがあり、このアイテムには「black tea」、「whitetea」などの多くの子アイテムがあります。

カテゴリ「お茶」に属する商品を選択する必要があります。これが私がそれをしている方法です:

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

例外をスローします(適切にフォーマットできません)

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

parent.id列が不明なため。

明らかに、クエリは次のようになります(完全に機能しています)。

    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

私も試しました

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

そしてそれは役に立たなかった

どうぞ、あなたの考え。

4

1 に答える 1

0

ここの操作joins()はかなり賢いですが、そのwhere()部分はそれほど賢くはありません。AFAIKは結合について何も知らず、実際には引数を文字列に変換するだけです。そのため、これを試してください:

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

ARによって内部的に使用される名前がコードに出血するのを防ぐために、クエリにARELを使用することを検討してください。最近、そのテーマに関するいくつかの優れたレールキャストがありました。

于 2012-09-23T17:54:18.147 に答える