2012-09-11 49 views
0

我有它由类似于以下对象的遗留数据库模式:遗留数据库架构 - 键/值表

table=car 
oid, something, something_else, ... 
has many properties -> car_properties 

table=car_properties 
oid, car_id, keyname, value, ... 
belongs to car 

车子对象实际上是(逻辑)在该列的组合“car”表和“car_properties”表中的多行。

我正在研究使用此模式的应用程序的并行重写,所以我需要一些方法将此表模式映射回一个很好的ActiveRecord对象。理想情况下,我希望_properties表中的每个属性都可以作为“Car”类中的一个方法访问,因此我可以稍后更改基础表而不会破坏事情。

我可以静态地定义Car类中的方法,但是我想确保ActiveRecord魔术有效,所以像.save这样的工作,我可以在以后更改底层模式(意识到这可能会是应用程序中断)。

我该如何去做ActiveRecord?

澄清:

基本上,我想下面的工作

@car = Car.first 
@car.something = something 
@car.someprop = something 

然而在上面,@code.someprop实际上是@car.properties.where("keyname = ?", "someprop").value

很显然,我不想做一个SQL查询每一次,虽然,所以我正在寻找一个很好的方式来做到这一点。

回答

0

除非我underthinking它,它应该是作为简单的东西:

class CarProperty < ActiveRecord::Base 
    set_primary_key :oid 

    belongs_to :car 
end 

class Car < ActiveRecord::Base 
    set_table_name :car 
    set_primary_key :oid 

    has_many :car_properties 

    accepts_nested_attributes_for :car_properties 
end 
+0

除非我误解了如何accepts_nested_attributes_for的作品,我不知道这是相当我后。 – Innominate

+0

我不认为ActiveRecord会帮你做到这一点。你可以用method_missing完成这个抽象层,但是你可能在这个过程中让自己疯狂。我更担心表示层。我认为关键是用户有一个很好的汽车和汽车性能界面? –

+0

是的,但我也希望后端对象能够很好地工作......特别是当我们开始重构数据库设计时(在我们完成了大约3个空间的全部端口之前,这是不可能发生的) -6个月) – Innominate