你的问题在于查找器是区分大小写的。我也遇到了与我的旧数据库完全相同的问题。
尝试这个方法,看看是否有效:
Person.find_by_Last_Name("Smith")
这应该可以解决问题。
我编写了一些代码来解决这类问题。它是一个小型修补程序,可插入到要修改的特定模型中的ActiveRecord中。
module ActiveRecord
class Base
cattr_accessor :downcase_legacy_field_names, :instance_writer => false
@@downcase_legacy_field_names = false
end
end
以上代码在ActiveRecord上创建了一个名为downcase_legacy_field_names的新访问器。它默认值为false。当在模型顶部将此访问器设置为true时,它将触发以下代码。
class << ActiveRecord::Base
def column_methods_hash
@dynamic_methods_hash ||= column_names.inject(Hash.new(false)) do |methods, attr|
attr_final = downcase_legacy_field_names ? attr.to_s.downcase : attr
attr_name = attr_final
methods[attr_final.to_sym] = attr_name
methods["#{attr_final}=".to_sym] = attr_name
methods["#{attr_final}?".to_sym] = attr_name
methods["#{attr_final}_before_type_cast".to_sym] = attr_name
methods
end
end
def downcase_legacy_field_methods
column_names.each do |name|
next if name == primary_key
a = name.to_s.underscore
define_method(a.to_sym) do
read_attribute(name)
end
define_method("#{a}=".to_sym) do |value|
write_attribute(name, value)
end
define_method("#{a}?".to_sym) do
self.send("#{name}?".to_sym)
end
end
end
end
ActiveRecord::Base.downcase_legacy_field_names = true
这段代码是从http://wiki.rubyonrails.org/rails/pages/HowToUseLegacySchemas中改编而来的。
在column_methods_hash
中,我们覆盖了ActiveRecord方法。此方法用于生成运行时为数据库模型创建的方法名称列表。我们不想在过程中覆盖任何早期的方法,因为这样会干扰ActiveRecord将我们的动态查找器(和其他方法)转换为适当的SQL语句以供遗留数据库使用的能力。
第二个方法downcase_legacy_field_methods
是一个新方法,它将实际生成downcase'd方法将执行的代码。
以上所有代码都是对ActiveRecord进行的补丁。这是一个猴子补丁,因此可以在加载ActiveRecord之后的任何地方要求。我将其放在了environment.rb中。
一旦您修补了ActiveRecord,还需要执行一个步骤。在遗留数据库模型的顶部,您需要有downcase_legacy_field_methods
这一行。它应该看起来像这样:
class LegacyDatabaseModel < ActiveRecord::Base
downcase_legacy_field_methods
def cubits_to_feet
end
end