我正在尝试构建一个Rails“Home Inventory”应用程序作为示例来帮助我学习rails。以下概述了我想要实现的目标:
此应用程序的主要目的是显示包含详细信息的页面。
因此,http://localhost:3000/living-room-couch会显示有关沙发的信息。
每个项目可以属于三个类别中的一个(或有一个?):
图书具有以下属性:
- 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
然后,根据型号名称选择属于哪个类别。
我希望我把问题说得对,我对此感到困惑。
感谢您的时间。
答案 0 :(得分:0)
我认为你不需要category
模型。您可以为每个模型创建book
,furniture
和electronic
模型以及一个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 %>
希望这能帮助你;)