геокодирование одного из нескольких изменений атрибутов

#ruby-on-rails #rails-geocoder

Вопрос:

с помощью Rails geocoder gem геокодирование выполняется как обратный вызов модели. Чтобы избежать бесполезного использования службы API геокодирования, этот обратный вызов должен быть обусловлен одним из ключевых атрибутов для формирования адреса для геокодирования; они сохраняются в базе данных ( address , municipal_id , postcode , region_id , nation_id ).

Определение виртуального атрибута, объединяющего эти значения

 def inserted_address
  [self.address, self.municipal.name, self.postcode, self.region.try(:name), self.nation.name].compact.join(', ')
end
 

не будет играть с грязным модулем ActiveRecord, так как он, по-видимому, действует только на значения, записанные в базе данных. Так obj.inserted_address.changed? что это не решение проблемы.
Но следующий метод в классе

 after_validation :geocode, if: ->(obj){ obj.inserted_address.present? and (obj.address.changed? or obj.postcode.changed? or obj.municipal_id.changed?) }
 

возвращает жалобу на то, что undefined method 'changed?' for "my street, 114":String

Как же тогда можно составить это утверждение?

Комментарии:

1. Вопрос немного неясен, вы говорите address , postcode , и municipal_id не хранятся в базе данных?

2. Нет, они сохранены (вопрос обновлен). это атрибут, определенный классом inserted_address , который не сохраняется.

3. Если я чего-то не упускаю inserted_address , это не имеет ничего общего с вопросом, с которым вы можете просто согласиться if: ->(obj){ [:address,:postcode,:municipal_id].any? {|attr| obj.public_send("#{attr}_changed?") }}

4. да, виртуальный наряд .changed? был заброшенным проспектом. Ваш синтаксис сотворил свое чудо.