已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
昨天关门了。
这篇文章是昨天编辑并提交审查的。
Improve this question
我正在学习Ruby on Rails,我正在更深入地研究数据库模型。我被关联卡住了。
使用案例:我在港口有一家企业,(小型)船只会把产品运进来,然后卡车会把产品运走。这是一个典型的仓库。我希望能够查看我的仓库(“任何仓库中有多少prodref
产品”?)。
我有三张table:产品,仓库和订单。我有它的产品和订单之间的工作,并希望整合仓库。
create_table "orders", force: :cascade do |t|
t.datetime "order_date"
t.integer "amount"
t.boolean "item_is_buy"
t.string "fk_prodref"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "products", force: :cascade do |t|
t.string "brand"
t.string "product_reference"
t.string "description"
t.string "category"
t.string "content_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["product_reference"], name: "index_products_on_product_reference", unique: true
end
create_table "warehouses", force: :cascade do |t|
t.string "wh_name"
t.string "fk_prodref"
t.integer "amount"
t.bigint "product_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["product_id"], name: "index_warehouses_on_product_id"
end
add_foreign_key "orders", "products", column: "fk_prodref", primary_key: "product_reference"
add_foreign_key "warehouses", "products", column: "fk_prodref", primary_key: "product_reference"
a)“产品”中的字段product_reference
是相关的搜索条件,因此,无论何时船只运入或卡车运出物料,此(字符串)字段都会引用它。
B)一个产品可以在多个仓库中(1:n关联)。
c)对于每一个产品进出,需要一个单一的订单。没有“5个产品在一个订单”。(这将是一个1:1的关联)。当一艘船带来5个产品,创建5个订单。
d)现在每个订单都应更新仓库amount
列。
我想为订单中的每个订单更新仓库的金额列。只有一个仓库。仓库没有订单,订单不属于仓库。所以我没有订单和仓库之间的关系。继续使用fk_prodref
。我订购了fk_prodref
(从产品表中捕获)。因此,我的订单控制器(或辅助控制器)可以是warehouse.amount = warehouse.amount + order.amount_in
,只需用订单中的fk_prodref
字符串填充仓库字段fk_prodref
。
我用product_reference
上的外键设置了模型产品和订单(id
上没有FK),它工作正常。我集成了仓库,并更新了工作。
一些关于3表关联的堆栈溢出问题处理“has many:通过”(汽车有发动机,发动机有活塞,使用car.pistons ...)但这里不是这样的。
这是不是一个糟糕的设计,只使用了外键,而没有使用与id
相关的外键?我是否违反了Rails原则?
1条答案
按热度按时间dzjeubhm1#
如果我理解正确的话,您需要的是产品和仓库的多对多关系,而不是一对多关系,一个仓库有多个产品,一个产品有多个仓库。
在rails中,这可以通过has_many:through关联来设置,请参阅Rails指南了解更多关于如何工作的细节,医生、病人和预约的例子与您尝试的类似。
看起来您的Orders表中还缺少一个
warehouse_id
字段。如果没有该字段,就无法确定订单的发货目的地/发货来源,因为产品可以同时存储在多个不同的仓库中。为了解决上述问题,您的关联应该如下所示:
要实现上述操作,您需要将warehouse_id和product_id字段添加到上述新的Inventory表中,并将warehouse_id字段添加到Orders表中。
您还应该从Warehouses表中删除product_id和fk_prodref字段,因为您不希望在那里有
belongs_to :product
关联。关于你提出的其他问题:
1.使用productref而不是product_id作为外键并不违反Rails原则。您可以使用foreign_key和primary_key选项设置关联
1.您可以在不创建仓库的情况下预先创建产品。当前设置中出现错误的原因是您使用了belongs_to,在最新版本的rails中,默认情况下需要该属性。如果您希望使belongs_to关联为可选,则需要添加
optional: true
。