Ruby on rails 关系数据库实现
我不确定这最好的实现是什么。我有两种不同类型的属性,我想跟踪故障。我希望能够在特定属性的显示页面上显示故障,然后在故障索引页面上查看所有故障 是否最好有多个与每个属性相关的故障表,或者每个属性链接到一个故障表?我关心的是,如果故障表中的多个空白id属性都放在一起,那么它们会有很多。但是如果它们分开,我会担心在视图中显示它们。我用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 -----------
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的故障)的方法将不起作用Truck.faults
:as=>:faultable
接口。我可以让您检查此设计实现,看看它是否合理/有效吗?我正在努力确保从一开始就正确设置了它,而不是建立一个糟糕的设计,并在访问数据时遇到问题。