在 Rails 3.1 之前,我们可以更新 ActiveRecord::Base 的self.columns方法。但这现在似乎不起作用。
现在看来,如果我从表中删除一列,我将被迫重新启动 Rails 服务器。如果我不这样做,当插入到表中时,我会不断收到错误。Rails 仍然认为旧列存在,即使它不再在数据库中。
在 Rails 3.1 之前,我们可以更新 ActiveRecord::Base 的self.columns方法。但这现在似乎不起作用。
现在看来,如果我从表中删除一列,我将被迫重新启动 Rails 服务器。如果我不这样做,当插入到表中时,我会不断收到错误。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)!
然后它会在您下次引用使用该表的模型时重新加载。