如何覆盖activerecord的默认属性列关联?

时间:2009-07-21 22:27:05

标签: ruby-on-rails ruby database activerecord legacy

我正在研究完全没有意义的遗留数据库。我有一个名为movie的表,其中包含名称为c00,c01,c02等的列。该表还使用非标准primary_keys。所以我创建了一个名为movie的类:

class Movie < ActiveRecord::Base
  set_table_name "movie"
  set_primary_key "idMovie"

  belongs_to :media_file, :foreign_key => "idFile" 

  def title
    self.c00
  end

  def plot
    self.c01
  end
end

我希望能够做类似Movie.find_by_title(“Die Hard”)的事情并让它返回正确的结果。另外我想能够说Movie.create(:title =&gt;“Die Hard”)。我该怎么做?

3 个答案:

答案 0 :(得分:1)

我想你想要alias_attribute。今年从RailsConf查看Brian Hogan's excellent presentation

答案 1 :(得分:0)

find_by_ *方法使用反射,所以Rails开箱即用就不会发生。当然,您可以定义自己的方法:

def self.find_by_title(title)
    first(:conditions => { :c00 => title })
end

下一步是迭代column_aliases =&gt;的散列。 real_columns用作调用alias_attribute和define_method的饲料。

答案 2 :(得分:0)

您真的只需要Sarah's answerBen's answer的组合:

class Movie < ActiveRecord::Base

  # gives you Movie.find_by_title
  # and lets you chain with other named scopes
  named_scope :find_by_title, lambda { |title| { :conditions => { :c00 => title } } }

  # gives you
  #   movie.title
  #   movie.title=(title)
  # and
  #   Movie.new(:title => title)
  alias_attribute :title, :c00

end