Пользовательские геттеры и сеттеры в Rails без Loop - PullRequest
0 голосов
/ 24 января 2019

У меня есть база данных Airports, которая имеет region "свойство". Ранее я управлял свойством region с помощью метода Airport#region, который искал объект Region на основе свойств аэропорта.

Теперь я добавил формальные отношения, чтобы Airport belongs_to :region. Все мои существующие Airports в настоящее время имеют, конечно, nil regions. Я переименовал старый метод Airport#region в Airport#set_region.

Я хочу собственный геттер, который в основном делает region ? region : set_region, он же region ||= set_region. Но, конечно, тогда я получаю петлю.

region = set_region выполняет работу, но неэффективно, так как я представляю, что она выполняет set_region, даже если уже назначено region.

Я также хочу иметь возможность установить «пользовательский» регион, если это необходимо (переопределить все, что set_region будет «вычислять»). Следующие решения не работают.

Первый задает регион (видимый из сеанса pry в методе), но не таким образом, чтобы он сохранялся после возврата управления к спецификации, из которой он был вызван.

region = reg
save

Это просто петли.

update(region: reg)

1 Ответ

0 голосов
/ 25 января 2019

Я понял это сам.Используйте region_id, чтобы обойти вызов вспомогательных методов, предоставляемых Rails, #region и #region=

  def region
    if region_id
      Region.find(region_id)
    else
      region = set_region
    end
  end

  def region=(reg)
    update(region_id: reg.id)
  end

Я хотел бы знать, если кто-нибудь знает о различных способах сделать это.

Мне бы очень хотелось узнать, есть ли способ заставить Region.find(nil) вернуть nil вместо того, чтобы выдать ошибку, чтобы я мог просто сделать Region.find(region_id) || set_region

РЕДАКТИРОВАТЬ: Ответвопрос, который я только что задал (вы знаете, две строки назад) - ТАДА !!

  def region
    Region.find_by(id: region_id) || set_region
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...