Sql 在Rails中设置DB表
我正在尝试使用Ruby/Rails设置以下基础设施。为了解释我的问题,这里用我试图建立的表格进行类比:Sql 在Rails中设置DB表,sql,ruby-on-rails,database,schema,Sql,Ruby On Rails,Database,Schema,我正在尝试使用Ruby/Rails设置以下基础设施。为了解释我的问题,这里用我试图建立的表格进行类比: 假设我有3个主要项目要建模/表示为表格:零件、制造商和汽车。因此,零件表包含所有独特的零部件,每个零部件都由制造商制造。制造商表包含制造零件的所有唯一制造商。Cars表包含所有独特的汽车。汽车是由零件组成的,制造商制造许多零件。我能用来表示这些信息的最有效的表结构是什么?我希望能够查询给定品牌汽车中的所有零件以及零件的制造商。我是DBs的新手,也是Rails的新手,因此我想了解我在顺利实现这一
假设我有3个主要项目要建模/表示为表格:零件、制造商和汽车。因此,零件表包含所有独特的零部件,每个零部件都由制造商制造。制造商表包含制造零件的所有唯一制造商。Cars表包含所有独特的汽车。汽车是由零件组成的,制造商制造许多零件。我能用来表示这些信息的最有效的表结构是什么?我希望能够查询给定品牌汽车中的所有零件以及零件的制造商。我是DBs的新手,也是Rails的新手,因此我想了解我在顺利实现这一目标方面有哪些选择。
部分属于:制造商,并且有许多:汽车
汽车
有很多零件
制造商“”有许多零件
有关如何设置的详细说明,请阅读。如果我正确理解您的问题:
制造商制造许多不同类型的零件,但每种类型的零件仅由一个制造商制造
一辆汽车包含多种类型的零件,一种类型的零件可以用于多种类型的汽车
对于给定类型的汽车,您想知道哪个制造商为该汽车制造零件
在这种情况下,可以在制造商、零件和车型之间建立以下关联:
制造商和零件之间的“一对多”(1:M)关联。(向manufacturer.rb添加有多个:零件,并且属于:manufacturer
到part.rb。)
零件和汽车之间的“多对多”(M:M)关联。(将has\u和\u-belishing\u添加到\u-many:cars
到part.rb,将has\u和\u-belishing\u添加到\u-many:parts
到car.rb。)
一个“有很多:通过”的协会,从汽车到零件再到制造商。(将添加到car.rb中有许多:制造商,通过::parts
)
然后,使用迁移为每个模型创建一个表
对于制造商和零件之间的1:M关联,零件表中应该有一列名为manufacturer\u id
。每个零件的制造商id(或“外键”)是一个整数,等于制造商表中特定制造商的id
(或“主键”)。换句话说,该零件“属于”该制造商。许多其他零件也可能属于该制造商
对于零件和汽车之间的M:M关联,您需要创建一个附加表(),该表包含名为parts\u id
和cars\u id
的列。这称为“连接表”。如果零件X包含在汽车Y中,连接表将有一行,其中零件id等于X,汽车id等于Y。这样,一个零件可以有许多汽车,反之亦然
汽车和制造商之间的联系是间接的。一辆汽车可以有许多部件,而这些部件中的每一个都属于制造商。因此,一辆汽车可以有许多制造商
还有一件事:对于M:M关联,您可以使用双面has\u many:to
来代替双面has\u many:to
。无论哪种方式,关联都需要三个表(零件、汽车和将它们连接在一起的表)。我不会进入HMT和HABTM之间的所有或中间。我认为底线是,“has_和_属于_-many”更简单,但“has_-many:through”会让你的应用程序更灵活,尤其是以后
--根据评论进行编辑--
每个表自动包含一个名为id
的整数列。这就是所谓的。因此,无需将part\u id
添加到parts表中,manufacturer\u id
添加到manufacturers表中,等等
但是,由于制造商和零件之间存在一个外键,因此零件表将需要一个外键,manufacturer\u id
。如果零件属于制造商,则零件表中该零件行的外键必须等于制造商表中该制造商行的主键
请注意,许多外键可以指向同一个主键,但反之亦然
有点不同。cars表和parts表都不需要外键。相反,必须有第三个表,其中包含名为car\u id
和part\u id
的外键列
零件表不需要制造商名称
列。制造商名称将位于制造商表中名为name
的列中。您可以通过遵循零件与其制造商之间的关联来获得它。例如,如果@my\u part
是表示某个零件的Ruby对象,则@my\u part.manufacturer
将提供该零件的制造商,而@my\u part.manufacturer.name
将提供该零件的制造商名称
显示信息本身就是另一个主题!可以这样说,您可以创建一个表示id为X的汽车所有部件的对象,如下所示:@parts\u for\u this\u car=Part.where(car\u id:X)
然后,这个车的对象@parts\u将是一个数组(具体地说,是一个Part对象数组)。在控制器操作中创建此对象(如controllers/car_controller.rb中的def show
),您可以在相应的视图文件(如views/cars/show.html.erb)中使用它。Hi,第1点和第2点正确,但第3点:对于给定的汽车,我希望能够列出其组成的所有零件。在part schema中,我将有part ID、part name、manufacturer\u ID、manufacturer\u name和其他一些字段。在manufacturer模式中,我将有manufacturer\u id、manufacturer\u name和一些其他杂项字段。在车里,我想要一辆ca