0

我有三个模型类别,项目类型和项目。用简单的英语我可以把我的要求说成:一个类别可以有零个或多个项目类型。一个项目类型必须只属于一个类别,并且可以有零个或多个项目。一个项目属于通过 itemtype.i 将它们关联到 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

现在我如何将一个项目与一个类别相关联。我的一个视图需要显示一个类别的所有项目。当我将其查询为

   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

现在 category 的实例应该能够列出所有项目。当您想列出某个类别的所有项目时,您应该通过以下方式获取它:

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:与 :order 和 :group 一起查找。您可能会在此处获得更多详细信息。

于 2012-09-14T09:02:41.783 回答
0

我不确定我会在这里依靠rails魔法。你能试一下吗

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

很抱歉在发布之前没有时间自己检查:-(

于 2012-09-14T08:44:21.543 回答