如何在ActiveRecord中建模多个关系?

时间:2010-06-25 10:04:54

标签: ruby-on-rails activerecord

我正在尝试构建一个Rails“Home Inventory”应用程序作为示例来帮助我学习rails。以下概述了我想要实现的目标:

此应用程序的主要目的是显示包含详细信息的页面。

因此,http://localhost:3000/living-room-couch会显示有关沙发的信息。

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

  1. 家具
  2. 电子。
  3. 图书具有以下属性:
      - isbn,
      - 页面,
      - 地址,
      - 类别

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

    电子产品具有以下属性:
      - 姓名,
      - 电压,
      - 地址,
      - 类别。

    -

    现在,在我的查看方面,我在rails中制作了3个模板,其中包含适合显示属于3个类别之一的项目的元素。 预订的模板显示isbn,电子设备的模板显示电压。

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

    项目,belongs_to或has_one 类别。类别可以是以下三种之一: Book Furniture Electronic

    我不知道该怎么做。我知道,由于具有不同的特征,每个类别如 Book 都将成为它自己的模型。

    我是否需要类别也有模型,因为它只包含 Book ,或家具电子产品即可。如果我采取将类别设为自己的模型的路线,我将如何使其与 Book 等模型相关。


    - 或

    我会选择这条路线(或者加入模型):

    class BookModel < ActiveRecord::Base
      has_many :categories
    End
    

    然后,根据型号名称选择属于哪个类别。

    我希望我把问题说得对,我对此感到困惑。

    感谢您的时间。

3 个答案:

答案 0 :(得分:0)

我认为你不需要category模型。您可以为每个模型创建bookfurnitureelectronic模型以及一个controller

修改

不,没有优势。我刚才说要创建不同的模型/控制器,因为在我看来,你所建模的是不同的东西。但如果您认为它们有很多共同点,我建议您使用单表继承。这样,每个项目都有一个表,并且只能有一个控制器,但每个项目都有一个模型。

答案 1 :(得分:0)

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

belongs_to :book
belongs_to :furniture
belongs_to :electronic

然后,您只能实际设置这些,并且可以对

进行测试
if item.book
#do things
end

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

答案 2 :(得分:0)

Item模型可以声明为多态(se here:http://guides.rails.info/association_basics.html#polymorphic-associations

所以你要声明Item:

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种型号(书本,家具和电子产品)中的一种相关联。 这些模型的每个实例都有一个'items'属性,如下所示:

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

您还可以使用多态模型使用has_many关联。

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

 <%= form_for :book, @book do |form| %>
   <%= form.text_field :isbn %>
   <!-- other fields -->
   <%= fields_for @book.item do |item_form| %>
      <%= item_form.text_field :name %>
   <% end %>
 <% end %>

希望这能帮助你;)