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
4

2 回答 2

2

您可以将多态关联与您现在拥有的模型一起使用,也可以使用单表继承将汽车和卡车组合成一个类。


多态关联如下所示:

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

您必须将faultable_id(int) 和faultible_type(string) 列添加到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

这有点难以理解,但Car都会TruckVehicle超类继承错误。这允许您在仅使用一个数据库表(单表继承)的同时将汽车和卡车与故障相关联。

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

楷模:

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)。不要触碰 的type属性Vehicle。Rails 会自动处理它。

  • 没有集合类方法,因此Truck.faults(所有卡车的故障)之类的方法将不起作用。

于 2013-04-25T00:57:45.240 回答
0

如果您希望能够同时显示所有故障并且还能够显示每个属性的故障,我认为这样的解决方案可能就是您正在寻找的

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

然后有一个条目 in Types,一个用于Car,一个用于Truck

Edit :经过进一步思考,我意识到vehicle_typein是不必要的,因为您可以使用以下方法Faults来获取错误: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'
于 2013-04-25T00:42:21.157 回答