Позже в файле есть метод reset_column_information
, который устанавливает @columns
в nil
:
def reset_column_information
connection.clear_cache!
undefine_attribute_methods
@column_names = @columns = @columns_hash = @content_columns = @dynamic_methods_hash = @inheritance_column = nil
@arel_engine = @relation = @arel_table = nil
end
nil
- это ложное значение в Ruby (то есть nil
и false
будут рассматриваться как ложные для if
операторов, логических операций и т. П.). Таким образом, установка @columns
(и всего остального) на nil
используется как способ сброса всей кэшированной информации, поэтому при следующем вызове columns
она будет пересчитана.
Таким образом, вам нужно выражение && @columns
в операторе if
. Если либо @columns
еще не определено, либо он был сброшен на nil
, он будет вычислять и кэшировать информацию столбца.