数据建模结构 - Rails

时间:2013-07-02 23:25:06

标签: ruby-on-rails ruby models

我有一个特定于项目的问题。我正在尝试确定在我的应用中设置模型的最有效和最合理的方法。这里建模的相关参与者是:供应商,供应商库存和产品。以下是每个项目应以某种方式返回的细分:

库存: 商店ID 产品和相关细节(价格,名称,品牌,详细信息,产品代码)

供应商:商店ID,位置,名称

产品:价格,名称,品牌,详情,产品代码

显然,这个方案在产品和库存之间存在很多重复。我的问题是,虽然供应商的库存中可能有相似的商品,但价格总是不同的。所以我不能简单地通过产品代码来描述模型。因为大多数供应商都会拥有相同的产品,如果我使用所有产品信息来模拟商店库存,那不是很多重复吗?我也可能不需要为供应商提供单独的模型,只能尝试保留所有库存,但我迷失了。请帮忙?!提前谢谢。

编辑:

这是我的模型结构,虽然我不确定它是理想的。

class Vendor < ActiveRecord::Base

    attr_accessible :name, :address

    has_one     :inventory
    has_many    :products, through: :inventories
end

class Inventory < ActiveRecord::Base

    has_many    :products
    belongs_to  :vendor
end

class Product < ActiveRecord::Base

    attr_accessible :upc, :brand, :product, :details, :price

    has_many    :inventories
    has_many    :vendors, through: :inventories

end

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的具体需求,特别是如果模型集只是例如,但从名称来看,这将是我的实现。

供应商是主要实体,它将通过联接表库存拥有许多产品,

class Vendor < ActiveRecord::Base

    attr_accessible :name, :address

    has_many     :inventories
    has_many    :products, through: :inventories
end

然而,产品的某些方面需要在供应商之间有所不同,在这种情况下,价格和数量(我刚刚提出),可以存储在连接表中,因为它是独立的并且为每个产品和供应商关系,非常适合存储价格和数量等信息。

class Inventory < ActiveRecord::Base

    attr_accessible :product_id, :vendor_id, :price, :quantity

    belongs_to  :product
    belongs_to  :vendor
end

产品应该只具有通用的属性,无论供应商如何处理它,同样如果产品在哪里被更改,它应该适用于所有供应商。

class Product < ActiveRecord::Base

    attr_accessible :upc, :brand, :product, :details

    has_many    :inventories
    has_many    :vendors, through: :inventories

end

执行此操作您可能无法在视图中对此进行编辑,设置库存的价格和数量。同样,我这样做的方法是使用嵌套字段并直接与连接表交互,而不是产品,这里是一些使用simple_form gem的快速部分代码,

在你的表格上,

  <%= f.simple_fields_for :inventories do |inventory_fields| %>
      <%= render partial: "inventory_fields", locals: {f: inventory_fields }%>
  <% end %>
  <%= link_to_add_fields "Add", f, :f %>

和inventory_fields.html.erb

  <%= link_to "Remove", '#', class: "remove_fields btn btn-danger" %>
  <%= f.input :product_id, collection: Product.all.somethingsomething, include_blank: false %>
  <%= f.input :price %>
  <%= f.input :quantity %>

现在,您可以从下拉列表中选择产品,并设置价格和数量,以及动态需要的任何产品。