vladamir
@vladamir

Массив растет после перезагрузки страницы, почему так происходит?

Привет, всем. Почему-то массив после .push() не обнуляется при перезагрузке страницы. Не могу понять, почему так.

class Stats

  class << self
    attr_accessor :condition, :result
  end

  @result = []
  @condition = {}

  def self.get_calculate_stats_by_model(model)
    tracks = Track.all
    # (...)
    tracks.each do |track|
      @result.push(Bar.get_stats_hash(track)
    end

    return @result
  end
end


Это модель не от AR - тут у меня просто отдельная логика вынесена. И при каждом открытие страницы, @result растет, я конечно могу в каждом методе вызывать @result = [] и у меня будет счастье, но я так и не пойму, почему так будет происходить. Да и может решение намного лучше, чем в каждом методе обнулять массив.

Ах, да, может это из-за контроллера?

class StatsController < ApplicationController

  before_action :set_default_params

  def campaigns
    @stats = Stats.get_calculate_stats_by_model(Campaign)
    render 'stats'
  end

  private
  def set_default_params
    @condition = {
      :date_from => params[:date_from] || Date.today-7,
      :date_to => params[:date_to] || Date.today,
    }

    Stats.condition = @condition
  end

end


То есть при каждой перезагрузке страницы @result наполняется дублированными записями. То есть, тупо, он не обновляется, как было бы в пхп. Это как-то работает кеш на переменные или моя тупость в логике? Хотя она по любому присутствует, исходя из проблемы. Спасибо.
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
Jeiwan
@Jeiwan
Потому что @result это инстансная переменная класса, которая живет столько же, сколько и класс Stats, то есть до перезагрузки приложения, а не до конца обработки запроса.
Understanding class instance variables in Ruby
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы