首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Rails中设置DB表

在Rails中设置DB表
EN

Stack Overflow用户
提问于 2014-03-21 11:53:47
回答 2查看 77关注 0票数 0

我正在尝试使用Ruby/Rails设置以下基础设施。为了解释我的问题,这里有一个我试图设置的表的类比:假设我有3个主要的项目,我想建模/表示为表:部件,制造商和汽车。因此,零件表包含所有唯一的零部件,每个零部件都由制造商制造。“制造商”表包含制造部件的所有唯一制造商。cars表包含所有独特的汽车。汽车是由零件组成的,制造商制造许多零件。我可以用来表示此信息的最有效的表结构是什么?我想要能够查询在给定的汽车制造中的所有部件,以及谁制造了这些部件。我是DB的新手,Rails的新手,所以我想了解我的选择是什么,以顺利实现这一点。

EN

回答 2

Stack Overflow用户

发布于 2014-03-21 12:08:27

Part belong_to :manufacturerhas_many :cars

Car has_many :parts

Manufacturer' 'has_many :parts

有关如何设置内容的详细说明,请阅读this

票数 1
EN

Stack Overflow用户

发布于 2014-03-22 00:59:44

如果我没理解错你的问题:

汽车制造商制造许多不同类型的部件,但每种类型的部件仅由一辆manufacturer.

  • A 制造。
  1. 包含多种类型的部件,并且一种类型的部件可以用于多种类型的汽车。
  2. 对于给定类型的汽车,您想知道是哪个制造商生产了该汽车的部件。

在这种情况下,您可以在制造商、部件和汽车模型之间设置以下关联:

  1. 制造商和零件之间的“一对多”(1:M)关联。(将has_many :parts添加到manufacturer.rb,将belongs_to :manufacturer添加到part.rb。)
  2. 部件和汽车之间的“多对多”(M:M)关联。(将has_and_belongs_to_many :cars添加到part.rb,将has_and_belongs_to_many :parts添加到car.rb。)
  3. A "has_many :Through.“关联,从汽车到零部件再到制造商。(将has_many :manufacturers, through: :parts添加到car.rb。)

然后,使用迁移为每个模型创建一个表。

对于制造商和零件之间的1:M关联,零件表中应该有一个名为manufacturer_id的列。每个部件的manufacturer_id (或“外键”)是一个整数,它等于制造商表中特定制造商的id (或“主键”)。换句话说,这个零件“属于”制造商。许多其他部件也可以属于该制造商。

对于parts和cars之间的M:M关联,您需要创建一个附加表(with a model),该表包含名为parts_idcars_id的列。这就是所谓的“连接表”。如果零件X包含在汽车Y中,连接表将有一个行,其中parts_id等于X,cars_id等于Y。这样,一个零件可以有许多汽车,反之亦然。

汽车和制造商之间的联系是间接的。一辆汽车可以有许多部件,而这些部件中的每一个都属于制造商。因此,一辆汽车可以有多个制造商。

Here's the best introduction to relational databases that I've found

还有一件事:对于M:M关联,您可以使用双面has_many :through而不是双面has_and_belongs_to_many。无论采用哪种方式,关联都需要三个表(parts、cars和将它们连接在一起的表)。我不会进入所有的differencestaking a sidedebate之间的HMT和HABTM。我认为底线是,"has_and_belongs_to_many“更简单,但是"has_many :through”会给你的应用带来更大的灵活性,特别是以后。

--回应评论的编辑--

每个表自动包含一个名为id的整型列。这就是primary key。因此,不需要将part_id添加到parts表中,也不需要将manufacturer_id添加到manufacturers表中,等等。

但是因为在制造商和零件之间有一个1:M association,所以零件表需要一个外键manufacturer_id。如果零件属于制造商,则零件表中该零件所在行的外键必须等于制造商表中该制造商所在行的主键。

请注意,许多外键可以指向同一主键,但反之亦然。

M:M associations有一点不同。cars表和parts表都不需要外键。相反,必须有第三个包含名为car_idpart_id的外键列的表。

零件表不需要manufacturer_name列。制造商名称将位于制造商表中名为name的列中。您可以通过跟踪零件与其制造商之间的关联来获取它。例如,如果@my_part是代表某个零件的Ruby对象,那么@my_part.manufacturer会告诉你该零件的制造商,而@my_part.manufacturer.name会给你该零件的制造商名称。

显示信息本身是一个完全不同的主题!可以这么说,您可以创建一个对象来表示id为X的汽车的所有部件,如下所示:@parts_for_this_car = Part.where(car_id: X)

然后,对象@parts_for_this_car将是一个数组(具体地说,是一个零件对象数组)。在一个控制器操作中创建这个对象(比如在控制器/cars_CONTROLER.rb中的def show ),您可以在相应的视图文件中使用它(比如views/cars/show.html.erb)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22549808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档