我正在研究完全没有意义的遗留数据库。我有一个名为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”)。我该怎么做?
答案 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 answer和Ben'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