0

不确定这是什么最好的实现。我有两种不同类型的财产,我想追踪故障。我希望能够在特定属性的显示页面上显示故障,然后查看故障索引页面上的所有故障。关系数据库实现

对于每个属性有多个故障表或每个属性链接到哪个故障表会更好吗?如果全部放在一起,我担心故障表中有多个空白id属性。但是如果他们分开了,我担心在视图中显示它们。我用rails来实现这个。

一个故障表

Cars     Trucks    Faults 
-----------   ----------   ----------- 
car_id     truck_id    fault_id 
attribute_1   attribute_1   car_id 
              truck_id 
              fault description 

两个故障表中(每个属性之一)

Cars     Trucks    car_Faults    truck_faults 
-----------   ----------   -----------    ----------------- 
car_id     truck_id    car_fault_id   truck_fault_id 
attribute_1   attribute_1   car_id     truck_id 
              fault description  fault description 

回答

2

你可以使用与您现有模型的多态关联,或者使用单表继承将汽车和卡车结合到一个类中。


态关联看起来是这样的:

Cars     Trucks    Faults 
-----------   ----------   ----------- 
id      id     id 
attribute_1   attribute_1   faultable_id 
              faultable_type 
              fault description 

您必须添加faultable_id(int)和faultible_type(字符串)列Fault。模型将如下所示:

def Car < ActiveRecord::Base 
    has_many :faults, :as => :faultable 
end 

def Truck < ActiveRecord::Base 
    has_many :faults, :as => :faultable 
end 

def Fault < ActiveRecord::Base 
    belongs_to :faultable, :polymorphic => true 
end 

可以让你做到这一点:

@car.fault 
# => returns car's fault 

@fault.faultible 
# => returns car or truck 

单表继承(STI)看起来是这样的:

Vehicle    Faults 
-----------   ---------- 
id      id 
type     vehicle_id 
attribute_1   fault description 

这是有点难理解,但CarTruck都将继承Vehicle超类的故障。这允许您在使用仅一个数据库表(单表继承)的情况下拥有与故障相关联的汽车和卡车。

汽车和卡车将作为车辆记录存储,并将共享共同属性。对于具有几乎相同属性的模型(例如“颜色”或“制造”),这非常理想。请记住,未使用的属性(卡车对象中的汽车属性)将为零。如果你正在处理许多不可互换的属性(因此还有许多nils),最好使用多态关联。

型号:

def Vehicle < ActiveRecord::Base 
    has_many :faults 
end 

def Car < Vehicle 
end 

def Truck < Vehicle 
end 

def Fault < ActiveRecord::Base 
    belongs_to :vehicle 
end 

有了这个,你可以这样做:

@truck.fault 
# => returns truck's fault 

@fault.vehicle 
# => returns either a Car or Truck object, depending on the type 

有一些注意事项,使用STI:

  • 你必须初始化一个子类(汽车或卡车); 从不实例化超类(即Vehicle.new)。请勿触摸Vehicletype属性。 Rails自动处理它。

  • 没有收集类的方法,所以像Truck.faults(所有卡车的故障)将不起作用。

+0

没有机会玩它,但它看起来像多态性工作。我假设您可以将关联添加到超过2个模型,方法是将所有需要关联的表添加为as => faultable?以上表格是使用 – 2013-04-25 12:14:59

+0

正确的实际模型Im的简化表示。只要它们都使用':as =>:faultable'接口,就可以在多态关联中使用尽可能多的模型。 – Substantial 2013-04-26 01:50:24

+0

我可以让你检查这个设计实现,看看它是否有意义/作品?我试图确保从一开始就正确设置了这一设置,而不是构建糟糕的设计,并遇到访问数据时出现问题的问题。 – 2013-04-26 22:39:18

0

如果你希望能够给所有的故障显示在一起,并且还能够显示每个故障财产我会认为这样的解决方案可能是你在找什么

Vehicles    Faults      Types 
-----------   -----------     --------- 
vehicle_id    fault_id     vehicle_type 
vehicle_type(FK)  vehicle_id(FK)     
attribute_1   vehicle_type(FK) 
         fault_description 

然后在TypesTruck

编辑条目,一个用于Car,和一个:在进一步的思考,我意识到,在Faultsvehicle_type是不必要的,因为获得Car故障,您可以使用:

SELECT fault_id AS F FROM Faults WHERE F.vehicle_id IN 
    SELECT vehicle_id FROM Vehicles AS V WHERE V.vehicle_type IN 
    SELECT vehicle_type FROM Types WHERE vehicle_type = 'Car'