0

私は3つのモデルCategory、ItemType、Item.Inを持っています。平易な英語で私は私の要件を次のように置くことができます:カテゴリは0個以上のアイテムタイプを持つことができます.ItemTypeは単一のカテゴリのみに属し、0個以上のアイテムを持つことができます. itemtype と itemtype を介したカテゴリに、以下のように関連付けました。

 class Category < ActiveRecord::Base
   has_many :item_types
   has_many :items ,:through => item_types, :source => category
 end  
 class ItemType < ActiveRecord::Base
   has_many :items
 end
 class Item < ActiveRecord ::Base
   belongs_to :item_type
 end

アイテムをカテゴリに関連付けるにはどうすればよいですか。私のビューの 1 つは、カテゴリのすべてのアイテムを表示する必要があります。私がそれをクエリすると

   Category.joins(:item_types,:items).where("categories.id=?",1)

私は以下のSQLを取得します

  SELECT "categories".* FROM "categories" INNER JOIN "item_types" ON "item_t
  ypes"."category_id" = "categories"."id" INNER JOIN "item_types"   
  "item_types_categories_join" ON "item_types_categories_join"."category_id" =
  "categories"."id" INNER JOIN "categories" "items_categor
  ies" ON "items_categories"."id" = "item_types_categories_join"."category_id" WHERE
  (categories.id=1)

誰でもここで私を助けてくれますか.以下のSQLを取得する方法

 select * from categories 
      inner join item_type on categories.id=item_types.category_id
      inner join items on item_types.id=items.item_type_id
 where categories.id =1
4

3 に答える 3

1

私が正しければ、関連付け宣言は不完全です。belongs_to :categoryItemType と Item モデルを追加する必要がある場合があります。例えば:

class Category < ActiveRecord::Base
   has_many :item_types
   has_many :items ,:through => item_types
 end  
 class ItemType < ActiveRecord::Base
   has_many :items
   belongs_to :category
 end
 class Item < ActiveRecord::Base
   belongs_to :item_type
   belongs_to :category
 end

これで、カテゴリのインスタンスですべてのアイテムを一覧表示できるようになります。カテゴリのすべてのアイテムをリストしたいので、次のようにして取得する必要があります。

cat = Category.find_by_id(ID_GOES_HERE)
cat.items
于 2012-09-14T08:56:18.063 に答える
1

このようなものが動作するはずです

#this will load your item_types and items earlier with less query.
Category.find(1, :include => [:item_types, :items])

また、モデルには次の変更が必要です

 class ItemType < ActiveRecord::Base
 ... ...
 +    belongs_to :category
 end

 class Item < ActiveRecord::Base
 ... ...
 +    belongs_to :category
 end

ここに関連リンクがあります - Rails Active Record: find と :order および :group を組み合わせて使用​​します。ここで詳細を取得できます。

于 2012-09-14T09:02:41.783 に答える
0

ここでレールマジックに頼るかどうかはわかりません。試してみませんか

Category.includes([:item_types,:items]).where(['items.item_type_id = ?',categories.item_type.id]).where(<...your conditions...>)

投稿する前に自分で確認する時間がなくてすみません:-(

于 2012-09-14T08:44:21.543 に答える