Rails 3.1 より前は、ActiveRecord::Baseのself.columnsメソッドを更新できました。しかし、それは今はうまくいかないようです。
テーブルから列を削除すると、Rails サーバーを再起動する必要があるようです。そうしないと、テーブルへの INSERT が発生したときにエラーが発生し続けます。Rails は、データベースにもう存在しないにもかかわらず、古い列が存在すると見なします。
Rails 3.1 より前は、ActiveRecord::Baseのself.columnsメソッドを更新できました。しかし、それは今はうまくいかないようです。
テーブルから列を削除すると、Rails サーバーを再起動する必要があるようです。そうしないと、テーブルへの INSERT が発生したときにエラーが発生し続けます。Rails は、データベースにもう存在しないにもかかわらず、古い列が存在すると見なします。
Active Recordは、データベースにクエリを実行してモデルの列を取得するため、これをそのままではサポートしていません(MerbのORMツールであるDatamapperとは異なります)。
それでも、Railsでこの機能にパッチを適用できます(たとえば、「非推奨」の文字列で始まる列を無視したい場合)。
module ActiveRecord
module ConnectionAdapters
class SchemaCache
def initialize(conn)
@connection = conn
@tables = {}
@columns = Hash.new do |h, table_name|
columns = conn.columns(table_name, "#{table_name} Columns").reject { |c| c.name.start_with? "deprecated"}
h[table_name] = columns
end
@columns_hash = Hash.new do |h, table_name|
h[table_name] = Hash[columns[table_name].map { |col|
[col.name, col]
}]
end
@primary_keys = Hash.new do |h, table_name|
h[table_name] = table_exists?(table_name) ? conn.primary_key(table_name) : nil
end
end
end
end
end
ActiveRecordスキーマキャッシュをクリアできます:
ActiveRecord::Base.connection.schema_cache.clear_table_cache(:table_name)!
次に、そのテーブルを使用するモデルを次に参照するときに再ロードされます。