使用Rails / ActiveRecord覆盖旧数据库中列的名称或别名

时间:2010-12-03 17:12:47

标签: ruby-on-rails database activerecord

我正在针对旧数据库编写Rails应用程序。此旧数据库中的一个表具有名为object_id的列。不幸的是object_id也是Ruby中每个对象的属性,所以当ActiveRecord尝试使用这些对象来表示查询时,它使用的是Ruby定义的object_id,而不是数据库中的值。

遗留应用程序在超过一百万行代码中非常庞大,因此只需更改数据库中列的名称就可以作为最后的选择。

问题:
1.有没有办法让ActiveRecord / Rails使用该列的别名或同义词?
2. Ruby中是否有任何方法可以使object_id方法的行为有所不同,具体取决于谁调用它? 3.我可以简单地覆盖我的模型中object_id方法的行为(我认为这是一个可怕的想法,但不得不问)

非常感谢任何建议。

2 个答案:

答案 0 :(得分:2)

我只是在这里吐痰,但你可能会尝试这样的事情:

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

答案 1 :(得分:0)

查看alias_attribute http://www.railstips.org/blog/archives/2008/06/20/alias-attribute/我相信它能满足您的需求。