действительно нужна вторая часть после && - PullRequest
1 голос
/ 17 ноября 2010

Ниже приведен фрагмент кода ActiveRecord :: Base of rails3

 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 ]

1 голос
/ 17 ноября 2010

Я много об этом говорил, и, честно говоря, трудно сказать, не зная больше о вашем коде.

Если имеет значение, является ли @columns верным или нет, тогда вы можете захотетьчтобы он оставался таким, какой он есть.

Если для @columns допустимо быть nil, то в этом нет необходимости.

0 голосов
/ 18 ноября 2010

Позже в файле есть метод 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, он будет вычислять и кэшировать информацию столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...