1

我有一个特定于项目的问题。我正在尝试确定在我的应用程序中设置模型的最有效和最合乎逻辑的方式。此处要建模的相关参与者是:供应商、供应商库存和产品。以下是每个项目应该能够以某种方式返回的内容的细分:

库存:商店 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
4

1 回答 1

1

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

A Vendor 是主要实体,它将通过连接表库存拥有许多产品,

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 %>

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

于 2013-07-03T08:09:41.267 回答