#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?
был заброшенным проспектом. Ваш синтаксис сотворил свое чудо.