我正在尝试使用Ruby/Rails设置以下基础设施。为了解释我的问题,这里有一个我试图设置的表的类比:假设我有3个主要的项目,我想建模/表示为表:部件,制造商和汽车。因此,零件表包含所有唯一的零部件,每个零部件都由制造商制造。“制造商”表包含制造部件的所有唯一制造商。cars表包含所有独特的汽车。汽车是由零件组成的,制造商制造许多零件。我可以用来表示此信息的最有效的表结构是什么?我想要能够查询在给定的汽车制造中的所有部件,以及谁制造了这些部件。我是DB的新手,Rails的新手,所以我想了解我的选择是什么,以顺利实现这一点。
发布于 2014-03-21 12:08:27
Part
belong_to :manufacturer
和has_many :cars
Car
has_many :parts
Manufacturer' 'has_many :parts
有关如何设置内容的详细说明,请阅读this。
发布于 2014-03-22 00:59:44
如果我没理解错你的问题:
汽车制造商制造许多不同类型的部件,但每种类型的部件仅由一辆manufacturer.
在这种情况下,您可以在制造商、部件和汽车模型之间设置以下关联:
has_many :parts
添加到manufacturer.rb,将belongs_to :manufacturer
添加到part.rb。)has_and_belongs_to_many :cars
添加到part.rb,将has_and_belongs_to_many :parts
添加到car.rb。)has_many :manufacturers, through: :parts
添加到car.rb。)然后,使用迁移为每个模型创建一个表。
对于制造商和零件之间的1:M关联,零件表中应该有一个名为manufacturer_id
的列。每个部件的manufacturer_id (或“外键”)是一个整数,它等于制造商表中特定制造商的id
(或“主键”)。换句话说,这个零件“属于”制造商。许多其他部件也可以属于该制造商。
对于parts和cars之间的M:M关联,您需要创建一个附加表(with a model),该表包含名为parts_id
和cars_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和将它们连接在一起的表)。我不会进入所有的differences或taking a side在debate之间的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_id
和part_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)。
https://stackoverflow.com/questions/22549808
复制相似问题