使用Rails/ActiveRecord覆盖或使用旧数据库中的别名名称
问题描述:
我正在为旧数据库编写Rails应用程序。这个遗留数据库中的一个表格有一个名为object_id
的列。不幸的是,object_id
也是Ruby中每个对象的属性,所以当ActiveRecord试图使用这些对象来制定查询时,它使用的是Ruby定义的object_id
,而不是数据库中的值。使用Rails/ActiveRecord覆盖或使用旧数据库中的别名名称
传统的应用程序有超过一百万行代码,因此只需更改数据库中列的名称即可作为最后选择。
问题:
1.有什么办法让ActiveRecord/Rails使用这个列的别名或同义词吗?
2. Ruby中有什么方法可以使object_id
方法的行为有所不同,具体取决于谁在调用它?
3.我可以简单地覆盖我的模型中的object_id方法的行为(我认为这是一个可怕的想法,但不得不问)
任何建议,非常感谢。
答
我只是那种spitballing这里,但你可以尝试这样的:
class Legacy < ActiveRecord::Base
#... all the other stuff
#give yourself a way to access the DB version of object_id
def oid
attributes[:object_id]
end
def oid=(val)
attributes[:object_id]=val
end
#restore ruby's default #object_id implementation
def object_id
super
end
end
感谢您的意见。这绝对有助于解决问题的一部分。问题的另一部分是ActiveRecord在生成where子句时需要调用原始列名称。例如,当我执行'Object.find_by_oid(3)'时,它将生成`select * from object_table where oid = 3`,这将导致错误,因为在数据库中该列实际上并不被称为oid。 – mberning 2010-12-03 20:14:48