ruby-on-rails 3张table上的导轨关联,没有“ID”?[已关闭]

omhiaaxx  于 2022-12-15  发布在  Ruby
关注(0)|答案(1)|浏览(121)

已关闭。此问题需要超过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原则?

dzjeubhm

dzjeubhm1#

如果我理解正确的话,您需要的是产品和仓库的多对多关系,而不是一对多关系,一个仓库有多个产品,一个产品有多个仓库。
在rails中,这可以通过has_many:through关联来设置,请参阅Rails指南了解更多关于如何工作的细节,医生、病人和预约的例子与您尝试的类似。
看起来您的Orders表中还缺少一个warehouse_id字段。如果没有该字段,就无法确定订单的发货目的地/发货来源,因为产品可以同时存储在多个不同的仓库中。
为了解决上述问题,您的关联应该如下所示:

class Warehouse
    has_many :products, through: :inventories
    has_many :orders
end

#new table required here to join Warehouses to Products
class Inventory
    belongs_to :warehouse
    belongs_to :product 
end

class Product
   has_many :orders
   has_many :warehouses, through: :inventories
end

class Order
   belongs_to :product
   belongs_to :warehouse
end

要实现上述操作,您需要将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选项设置关联

class Order
    belongs_to :product, foreign_key: :fk_productref, primary_key: 
    :productref 
end

1.您可以在不创建仓库的情况下预先创建产品。当前设置中出现错误的原因是您使用了belongs_to,在最新版本的rails中,默认情况下需要该属性。如果您希望使belongs_to关联为可选,则需要添加optional: true

相关问题