在Rails 3.1之前,我們可以更新ActiveRecord :: Base的方法self.columns。 但現在看來並不奏效。如何在Rails 3.2中隱藏模型中的列?
現在看來,如果我從表中刪除一列,我不得不重新啓動Rails服務器。如果我不這樣做,我會在INSERT發生時發生錯誤。 Rails仍然認爲舊列存在,即使它不在數據庫中。
在Rails 3.1之前,我們可以更新ActiveRecord :: Base的方法self.columns。 但現在看來並不奏效。如何在Rails 3.2中隱藏模型中的列?
現在看來,如果我從表中刪除一列,我不得不重新啓動Rails服務器。如果我不這樣做,我會在INSERT發生時發生錯誤。 Rails仍然認爲舊列存在,即使它不在數據庫中。
活動記錄不支持開箱即用,因爲它會查詢數據庫以獲取模型的列(與Merb的ORM工具Datamapper不同)。
然而,你可以修補on 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 schema cache:
ActiveRecord::Base.connection.schema_cache.clear_table_cache(:table_name)!
然後,它會在引用使用該表的模型下一次重新加載。
原因爲downvote? – Brandan
它不會隱藏活動記錄中的列:只有在數據庫上刪除它時纔會將其刪除。 –
這不正是OP要求的嗎? 「現在看來,如果我從表中刪除列...... Rails仍然認爲舊列存在,即使它不在數據庫中了。」 – Brandan