在Rails中设置数据库表

时间:2014-03-21 03:53:47

标签: sql ruby-on-rails database schema

我正在尝试使用Ruby / Rails设置以下基础结构。在这里解释我的问题是我试图建立的表格的类比:   假设我有3个主要项目我想模拟/表示为表:零件,制造商和汽车。因此,零件表包含制造商生产的所有独特零部件。制造商表包含制造零件的所有独特制造商。汽车表包含所有独特的汽车。汽车由零件组成,制造商生产许多零件。我可以用来表示这些信息的最有效的表结构是什么?我希望能够查询给定品牌汽车的所有部件以及制造部件的人员。我是DB的新手,是Rails的新手,所以我想了解我在顺利实现这一目标方面的选择。

2 个答案:

答案 0 :(得分:1)

Part belong_to :manufacturerhas_many :cars

Car has_many :parts

Manufacturer' 'has_many :parts

阅读this,了解如何设置内容的详细说明。

答案 1 :(得分:0)

如果我理解你的问题:

  1. 制造商生产许多不同类型的零件,但每种零件只由一家制造商生产。

  2. 汽车包含多种类型的零件,一种零件可用于多种类型的汽车。

  3. 对于特定类型的汽车,您想知道哪个制造商生产了该汽车的零件。

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

    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. 从汽车到零件再到制造商的“has_many:through”协会。 (将has_many :manufacturers, through: :parts添加到car.rb。)

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

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

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

      汽车与制造商之间的关系是间接的。汽车可以有许多零件,每个零件都属于制造商。因此,汽车可以有很多制造商。

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

      还有一件事:对于M:M关联,您可以使用双面has_and_belongs_to_many而不是双面has_many :through。无论哪种方式,该关联需要三个表(部件,汽车和将它们连接在一起的表)。我不会进入HMT和HABTM之间explaining中的所有differencestaking a side debate。我认为底线是“has_and_belongs_to_many”更简单,但“has_many:through”将为您的应用提供更大的灵活性,尤其是以后。

      - 编辑以回应评论 -

      每个表自动包含一个名为id的整数列。这叫做primary key。因此,无需将part_id添加到零件表,manufacturer_id添加到制造商表等。

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

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

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

      零件表不需要manufacturer_name列。制造商名称将位于manufacturer表中名为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将是一个数组(具体地说,是一个Part对象数组)。在控制器操作中创建此对象(例如controllers / car_controller.rb中的def show),您可以在相应的视图文件中使用它(例如views / cars / show.html.erb)。