如何在Rails 3.2中隐藏模型中的列?

时间:2012-10-22 22:44:20

标签: ruby-on-rails activerecord

在Rails 3.1之前,我们可以更新ActiveRecord :: Base的 self.columns 方法。 但现在似乎没有用。

现在看来,如果我从表中删除一列,我被迫重启Rails服务器。如果我不这样做,我会在INSERT到表时发生错误。 Rails仍然认为旧列存在,即使它不再存在于数据库中。

2 个答案:

答案 0 :(得分:4)

Active Record不支持开箱即用,因为它会查询数据库以获取模型的列(与Merb的ORM工具Datamapper不同)。

尽管如此,您可以在Rails上修补此功能(例如,假设您要忽略以“deprecated”字符串开头的列):

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

答案 1 :(得分:1)

您可以清除ActiveRecord schema cache

ActiveRecord::Base.connection.schema_cache.clear_table_cache(:table_name)!

然后在下次引用使用该表的模型时重新加载。