Обновить переменную экземпляра класса, установленную с помощью || = - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть переменная экземпляра модели, в которой я храню описания, которые будут "в основном" статичными по всему приложению.

Код выглядит так

def self.get_lastname(client_id)
  @client_by_lastname ||= Client.select(:id, :lastname)
  .map{|e| e.attributes.values}
  .inject({}){|memo, client| memo[client[0]] = client[1]; memo}
  return @client_by_lastname[client_id] if @client_by_lastname[client_id]

  result = Client.select('lastname').where('id = ?',client_id)
  return @client_by_lastname[client_id] = result[0].lastname 
end

По сути.При первой загрузке он хранит клиентов и их фамилии в массиве.Однако клиент «может» менять фамилию время от времени, когда клиент покупает другая организация.Идентификатор клиента остается прежним, но имя и фамилия будут изменены.Когда это происходит, эта клиентская фамилия в приложении оказывается неверной, и нам, по сути, приходится перезапускать приложение для сброса переменной экземпляра.

Должен быть способ сброса этих переменных экземпляра, чтобыони перезагружаются при следующем запросе.Затем я поместил бы обратный вызов after_save в файл клиента при изменении имени или фамилии и перезагрузил бы эту переменную экземпляра.

Как можно "обновить" переменную экземпляра?

1 Ответ

0 голосов
/ 11 февраля 2019

Как можно "обновить" переменную экземпляра?

Просто установите ее на nil.Затем, при следующем вызове, он будет перезагружен из базы данных.

Или вы можете заранее заменить значение самостоятельно.Во-первых, отдельное запоминание и вычисление.

def self.get_lastname(client_id)
  @client_by_lastname ||= compute_client_by_last_name

end

def compute_client_by_last_name
  Client.select(:id, :lastname)
      .map{|e| e.attributes.values}
      .inject({}){|memo, client| memo[client[0]] = client[1]; memo}
end

Затем, когда вы хотите обновить состояние (в обратном вызове after_save или где-либо еще)

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