質問を投稿した後しばらくして、alias_attribute が実際には解決策であるという閃きがありましたが、それには少し魔法が必要でした。これが私自身の問題の解決策です:
module LegacyDatabase
module ClassMethods
def aliased_attributes
@aliased_attributes ||= {}
end
def alias_attribute(new_name, old_name)
self.aliased_attributes[new_name.to_sym] = old_name.to_sym
super(new_name, old_name)
end
end
module InstanceMethods
private
def read_attribute(attr_name)
attr_name = self.class.aliased_attributes[attr_name.to_sym] if self.class.aliased_attributes.has_key?(attr_name.to_sym)
super(attr_name)
end
def write_attribute(attr_name, value)
attr_name = self.class.aliased_attributes[attr_name.to_sym] if self.class.aliased_attributes.has_key?(attr_name.to_sym)
super(attr_name, value)
end
end
def self.included(base)
base.instance_eval do
extend(ClassMethods)
include(InstanceMethods)
end
base.columns.each do |column|
legacy_name = column.name
rails_name = column.name.underscore
if legacy_name != rails_name
base.alias_attribute rails_name, legacy_name
end
end
end
end
これは、すべての ActiveRecord コードを台無しにしないために可能な最小限のコード変更だと思います。これについてのあなたの意見と、もしあなたが私がぶつけようとしているのに私がぶつからない壁を見たら、あなたのコメントをお願いします!
解決策を説明するために、ActiveRecord の columns メソッドを使用して、各列の snake_case に似たエイリアスを生成しています。また、alias_column にエイリアスのメモリを与えています。これにより、読み取りおよび書き込み属性メソッドがいつエイリアス名を処理しているかがわかります。
私のレガシー データベースでは、ID またはテーブル Table の規則は TableID であるため、私のソリューションでは、「table_name_with_underscore」規則を使用して ActiveRecord によって検出された table_id エイリアスが作成されるため、id メソッドは期待どおりに機能します。
何かの Squeel を使用した場合でも、すべての SQL フェッチで機能するとは限らないと思いますが、これに対する簡単な解決策はないと思います。