以下是来自rails3的ActiveRecord :: Base的代码片段
def columns
unless defined?(@columns) && @columns
@columns = connection.columns(table_name, "#{name} Columns")
@columns.each { |column| column.primary = column.name == primary_key }
end
@columns
end
我认为我们所需要的只是
unless defined?(@columns)
因为@columns永远不会是假的,如果它被设置
答案 0 :(得分:1)
我已经在这方面来回走了,老实说,如果不了解你的代码,很难说。
如果@columns
是否真实无关紧要,那么您可能希望保持原样。
如果@columns
nil
可以接受,则不需要。
答案 1 :(得分:0)
在文件的后面,有一个方法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
将被视为false,用于if
语句,布尔运算和类似)。因此,将@columns
(以及其他所有内容)设置为nil
用作重置所有缓存信息的方式,因此下次有人调用columns
时,它将被重新计算。
因此,您需要&& @columns
语句中的if
子句。如果尚未定义@columns
或已将其重置为nil
,则它将计算并缓存列信息。