2010-06-25 35 views
1

我正在尝试完成构建Rails“Home Inventory”应用程序,以帮助我学习rails。以下给出了我试图实现的一般概述:如何在ActiveRecord中建立多个关系?

此应用程序的主要目的是显示一个页面的详细信息。因此,http://localhost:3000/living-room-couch将显示关于沙发的信息。

每个项目,可以属于一个(或有一个?)三类:

  1. 家具
  2. 电子。

具有以下属性:
- ISBN,
- 网页,
- 地址,
- 类

家具具有以下特性:
- 颜色,
- 价格,
- 地址,
个 - 类

电子具有以下特点:
- 名称,
- 电压,
- 地址,
- 类。

-

现在我查看的一面,我已经在轨,包含适合于显示属于3类之一中的项目元素组成3个模板。 模板显示isbn,模板电子显示电压。

如何在ActiveRecord中对此进行建模?我会把它写成英文,也许有人可以帮助翻译成Rails:

An Item,belongs_to or has_one category。类别可以是以下三种之一:Book家具电子

我不知道该怎么做。我知道每个类别如本书将因其具有不同的特性而成为它自己的模型。

我需要有类别有一个模型也一样,因为它只会包括,或家具电子。如果我要将类别划分为自己的模型,我将如何将它与模型相关联,例如Book


--or

请问我只是走这条路(或者加入模型):

class BookModel < ActiveRecord::Base 
    has_many :categories 
End 

然后,选择哪一类所属的基础上,型号名称。

我希望我把这个问题放在正确的位置,我对此很困惑。

非常感谢您的时间。

+0

我已经编辑我的答案:] – 2010-06-25 16:07:04

+0

从我的经验,我已经意识到,Rails使屏障进入规模较小,但只是增加了更多的障碍跳过。没有我想的免费午餐。 我认为多态方法可能是正确的。所以我再去读那一章。 – BriteLite 2010-06-25 18:51:19

回答

0

我不认为你需要category模型。您可以为每一个创建book,furnitureelectronic模型和一个controller

编辑

没有,有没有优势。我刚刚说过要创建不同的模型/控制器,因为在我看来,你建模的东西是不同的东西。但如果你认为他们会有很多共同点,我建议你使用单表继承。通过这种方式,每个物品都有一张桌子,只能有一个控制器,但每个物品都有一个模型。

+0

使用多个控制器是否有优势,而不仅仅是使用某种形式的关系来关联模型,而只是使用一个控制器。 我说,因为控制器将有一个目的:确定项目是哪个类别,然后渲染适当的模板。 – BriteLite 2010-06-25 15:41:00

0

为什么没有一个项目有以下关系:

belongs_to :book 
belongs_to :furniture 
belongs_to :electronic 

您只可以实际设置在其中,并能为每个项目做的

if item.book 
#do things 
end 

一个测试,如果你关心它是否是一本书等等。你甚至可以使用验证来确保它一次只属于一件事。

+0

当我在S.O中输入这个问题时,我确实得到了这个想法。 所以你说的是我应该有一个每个类别的模型?到目前为止,我会有Item Model。并且我会为书籍,家具和电子产品以外的类别添加其他模型是否正确? – BriteLite 2010-06-25 15:36:27

+0

当然,虽然我不完全确定你为什么需要一个Item模型(你只是试图表明书籍,家具和电子产品都是物品?就像超类的形式?),但总的来说,这就是我处理可能属于一个或多个其他模型的模型。 – Jenny 2010-06-25 16:37:43

+0

从您的描述来看,我个人根本没有物品,只是担心书/家具/电子产品。如果您需要显示数据库中的所有内容,请在一行中显示@books,@furniture等?例如,我可能有一个猫模型和一个鼠标模型...但是我也不会从这两个动物模型中获得太多的收益,除非我计划对这个继承进行一些操作。如果我想展示所有的动物,那么我只展示所有的猫和所有的老鼠,你知道吗? – Jenny 2010-06-25 16:40:30

0

的项目模型可以声明为多态(SE这里:http://guides.rails.info/association_basics.html#polymorphic-associations

所以你申报项目:

class Item < ActiveRecord::Base 
    belongs_to :category, :polymorphic => true 
end 

那么3款充当类(我带你去一个,其他都相同):

class Employee < ActiveRecord::Base 
    has_one :item, :as => :category 
end 

# and so on... 

这样你可以在项目的3款车型(图书,家具和电子产品)的一个相关联。 这些模型的实例将有一个“项目”属性附加伤害,就像这样:

@book.items # returns all the items associated to a @book object 

您也可以使用多态模型中使用的has_many关联。

对于视图,可以使用嵌套窗体对象(请参见:http://guides.rails.info/form_helpers.html)。基本上,在每个表单中,您应该嵌套一个表单来创建一个Item对象。按照书例子,你就会有这样的事情:

希望这有助于你;)

+0

Apeacox,感谢您的回复。 我前几天看了Ryan Bates的视频,我有点理解多态关系。他的评论适用于不同模型的例子很有意义。我有一种感觉,我可能需要在这里应用多态关系。 请验证这是最好的方法:书,家具都属于模型CATEGORY,属于ITEM,或ITEM有一个类别(BOOK或FURNITURE)。我是否需要模型类别?如果我这样做,我会假设我会让ITEM模型变成一个多态的模型,它可以属于3个CATEGORIES中的任何一个。对? – BriteLite 2010-06-25 18:39:31

+0

是的,如果你使物品多态,它可以属于3个类别之一。你会将它们称为“类别”(请参阅​​我的答案中的示例)。因此@item可以执行@ item.category_id和@ item.category_type来知道确切的对象(模型的类和id),那么如果类别是Book或@item,则可以引用@ item.category.isbn。 category.price如果它是一个家具 – 2010-06-26 08:00:06