Ruby on rails 关系数据库实现

Ruby on rails 关系数据库实现,ruby-on-rails,database,model-view-controller,database-design,Ruby On Rails,Database,Model View Controller,Database Design,我不确定这最好的实现是什么。我有两种不同类型的属性,我想跟踪故障。我希望能够在特定属性的显示页面上显示故障,然后在故障索引页面上查看所有故障 是否最好有多个与每个属性相关的故障表,或者每个属性链接到一个故障表?我关心的是,如果故障表中的多个空白id属性都放在一起,那么它们会有很多。但是如果它们分开,我会担心在视图中显示它们。我用rails实现了这一点 一个故障表 Cars Trucks Faults -----------

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

是否最好有多个与每个属性相关的故障表,或者每个属性链接到一个故障表?我关心的是,如果故障表中的多个空白id属性都放在一起,那么它们会有很多。但是如果它们分开,我会担心在视图中显示它们。我用rails实现了这一点

一个故障表

Cars                   Trucks                Faults
-----------            ----------           -----------
car_id                 truck_id              fault_id
attribute_1            attribute_1           car_id
                                             truck_id
                                             fault description
两个故障表(每个属性一个)


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

Vehicles                Faults                      Types
-----------            -----------                 ---------
vehicle_id             fault_id                    vehicle_type
vehicle_type(FK)       vehicle_id(FK)                  
attribute_1            vehicle_type(FK)
                       fault_description
然后在
类型
中有一个条目,一个用于
汽车
,一个用于
卡车


编辑:经过进一步思考,我意识到
故障
中的
车辆类型
是不必要的,因为要获取
车辆
故障,您可以使用:

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'

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


多态关联如下所示:

Cars                   Trucks                Faults
-----------            ----------           -----------
id                     id                    id
attribute_1            attribute_1           faultable_id
                                             faultable_type
                                             fault description
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
Vehicle                Faults
-----------            ---------- 
id                     id   
type                   vehicle_id
attribute_1            fault description
您必须在
故障
中添加
faultable\u id
(int)和
faultable\u type
(string)列。模型将如下所示:

Cars                   Trucks                Faults
-----------            ----------           -----------
id                     id                    id
attribute_1            attribute_1           faultable_id
                                             faultable_type
                                             fault description
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
Vehicle                Faults
-----------            ---------- 
id                     id   
type                   vehicle_id
attribute_1            fault description

单表继承(STI)如下所示:

Cars                   Trucks                Faults
-----------            ----------           -----------
id                     id                    id
attribute_1            attribute_1           faultable_id
                                             faultable_type
                                             fault description
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
Vehicle                Faults
-----------            ---------- 
id                     id   
type                   vehicle_id
attribute_1            fault description
这有点难理解,但是
Car
Truck
都会从
Vehicle
超类继承故障。这允许您在仅使用一个数据库表(单表继承)的情况下,将汽车和卡车与故障关联

汽车和卡车将存储为车辆记录,并共享公共属性。这非常适用于具有几乎相同属性(如“颜色”或“制造”)的模型。请记住,未使用的属性(卡车对象中的汽车属性)将为零。如果您正在处理许多不可互换的属性(因此也有许多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
使用STI有一些注意事项:

  • 必须实例化子类(Car或Truck);切勿实例化超类(即
    Vehicle.new
    )。请勿触摸
    车辆的
    类型
    属性。Rails会自动处理它

  • 没有收集类方法,因此类似于
    Truck.faults
    (所有Truck的故障)的方法将不起作用


还没有机会使用它,但看起来多态性可以工作。我假设您可以通过将:as=>faultable添加到所有需要正确关联的表中,从而与2个以上的模型建立关联?上表是使用正确的实际模型的简化表示。您可以在多态关联中拥有所需的任意多个模型,前提是它们都使用
:as=>:faultable
接口。我可以让您检查此设计实现,看看它是否合理/有效吗?我正在努力确保从一开始就正确设置了它,而不是建立一个糟糕的设计,并在访问数据时遇到问题。