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

Ruby on rails 如何在ActiveRecord中建模多个关系?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在尝试构建一个Rails“Home Inventory”应用程序,作为帮助我学习Rails的示例。以下概述了我正在努力实现的目标: 此应用程序的主要目的是显示包含详细信息的页面 因此,将显示有关沙发的信息 每个项目可以属于三个类别中的一个(或有一个): 书 家具 电子学 书籍具有以下属性: -isbn, -页面, -地址, -类别 家具具有以下属性: -颜色, -价格, -地址, -类别 电子产品具有以下特性: -名称, -电压, -地址, -类别 -- 现在在我的视图方面,我在rails中

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

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

因此,将显示有关沙发的信息

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

  • 家具
  • 电子学
  • 书籍具有以下属性:
    -isbn,
    -页面,
    -地址,
    -类别

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

    电子产品具有以下特性:
    -名称,
    -电压,
    -地址,
    -类别

    --

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

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

    属于或具有一个类别的项目。类别可以是三个类别之一:书籍、家具或电子产品

    我不知道怎么做。我知道每个类别,如图书都将是自己的模型,因为它们具有不同的特点

    我是否需要有类别也有一个模型,因为它只包含书籍,或家具电子产品。如果我要采取使类别成为其自身模型的方法,我将如何使其与诸如书籍之类的模型相关联


    --或

    我会走这条路线(或者加入模特儿公司):

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

    我希望我把问题说对了,我只是对此感到困惑


    谢谢您抽出时间。

    我想您不需要
    类别的
    型号。您只需创建
    书籍
    家具
    电子
    模型,并为每个模型创建一个
    控制器

    编辑


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

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

    belongs_to :book
    belongs_to :furniture
    belongs_to :electronic
    
    然后,您只能实际设置其中的一个,并且可以对

    if item.book
    #do things
    end
    

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

    项目模型可以声明为多态(此处为se:)

    因此,您将声明项目:

    class Item < ActiveRecord::Base
      belongs_to :category, :polymorphic => true
    end
    
    您还可以使用多态模型使用多个关联

    对于视图,可以使用嵌套的表单对象(请参见此处:)。基本上,在每个表单中,都应该嵌套一个表单来创建一个Item对象。按照本书的示例,您将有如下内容:

    @book.items # returns all the items associated to a @book object
    
     <%= 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 %>
    
    
    

    希望这对你有帮助;)

    当我把这个问题输入S.O.时,我的想法是正确的。所以你的意思是,我应该为每一个类别建立一个模型?到目前为止,我会有一个项目模型。我会为书籍、家具和电子产品以外的类别添加其他模型,对吗?当然,虽然我不太清楚为什么需要一个项目模型(你只是想表明书籍、家具和电子产品都是项目?就像一种超级类?),但总的来说,这就是我处理可能属于一个或多个其他模型的模型的方式。根据你的描述,我个人根本不会有任何项目,只担心书籍/家具/电子设备。如果需要显示数据库中的所有内容,请将@books、@furniture等显示在一行中?例如,我可能有一个猫模型和一个老鼠模型……但我不会从同时拥有一个两者都属于我的动物模型中获得太多,除非我计划对遗传做些什么。如果我想展示所有的动物,那么我就展示所有的猫,所有的老鼠,你知道吗?谢谢你的回答,珍妮。下面的Apeacox回应说需要多态关系,我认为这是有意义的。我的意思是,根据我的理解,因为一个项目有一个类别。模型类别由书籍或家具模型(具有适当的数据库字段)组成,因此将项目设置为多态项是有意义的,这样它就可以应用于书籍或家具。我的意思是,简单地说,我想做的是,找出如何使类别模型由书籍和家具模型组成,这样我就可以将一个项目附加到一个类别,这样在视图中,我就可以呈现rite Templates使用多个控制器的优势,与仅使用某种形式的关系关联模型和仅使用一个控制器相比。我这样说是因为控制器有一个目的:确定项目的类别,然后呈现适当的模板。我编辑了我的答案:]根据我的经验,我意识到Rails使进入壁垒变小,但只是增加了更多的跨越壁垒。我想没有免费的午餐吧。我认为多态方法可能是正确的。所以我又去读那一章了。阿皮亚科斯,谢谢你的回复。前几天我看了一段Ryan Bates的视频,我多少理解了多态关系。他举例说明一条评论适用于不同的人
    @book.items # returns all the items associated to a @book object
    
     <%= 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 %>