是和&&真的需要

时间:2010-11-17 01:22:08

标签: ruby-on-rails

以下是来自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永远不会是假的,如果它被设置

2 个答案:

答案 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中是假值(即nilfalse将被视为false,用于if语句,布尔运算和类似)。因此,将@columns(以及其他所有内容)设置为nil用作重置所有缓存信息的方式,因此下次有人调用columns时,它将被重新计算。

因此,您需要&& @columns语句中的if子句。如果尚未定义@columns或已将其重置为nil,则它将计算并缓存列信息。