使用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 
+0

感谢您的意见。这绝对有助于解决问题的一部分。问题的另一部分是ActiveRecord在生成where子句时需要调用原始列名称。例如,当我执行'Object.find_by_oid(3)'时,它将生成`select * from object_table where oid = 3`,这将导致错误,因为在数据库中该列实际上并不被称为oid。 – mberning 2010-12-03 20:14:48

退房alias_attribute http://www.railstips.org/blog/archives/2008/06/20/alias-attribute/我相信它,你在找什么。