1

我正在研究一个完全没有意义的遗留数据库。我有一个名为 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 => "Die Hard")。我该怎么做呢?

4

3 回答 3

1

我想你想要alias_attribute。查看今年 RailsConf的 Brian Hogan 的精彩演讲。

于 2009-07-21T22:33:37.493 回答
0

find_by_* 方法使用反射,因此在开箱即用的 Rails 中不会发生这种情况。当然,您可以定义自己的方法:

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

下一步将遍历 column_aliases => real_columns 的哈希值,以用作调用 alias_attribute 和 define_method 的素材。

于 2009-07-21T23:03:36.247 回答
0

你真的只需要结合莎拉的答案本的答案

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
于 2009-07-22T11:53:24.717 回答