Вы не можете вызывать методы класса внутри метода экземпляра. Помните, что geocoded_by
, вероятно, определен для класса вашей модели. Вы не можете произвольно изменить проверки одного экземпляра, не затрагивая все экземпляры модели, поэтому это обычно рассматривается как плохая идея.
Возможно, вам лучше иметь модель «Местоположение», которую можно геокодировать одним из двух разных способов, и создать подкласс для каждого типа кодирования. То есть правила могут быть установлены для каждого из них независимо. Хранить их легко с помощью технологии Single Table Inheritance (STI).
Итак, вы могли бы:
class Location < ActiveRecord::Base
end
class ForwardLocation < Location
geocoded_by :address
after_validation :geocode
end
class ReverseLocation < Location
reverse_geocoded_by :latitude, :longitude,
:address => :address
after_validation :reverse_geocode
end
Затем вы должны добавить правильное местоположение соответственно:
self.location = self.address? ? ReverseLocation.create(...) : ForwardLocation.create(...)
Вы также можете написать методы, которые обрабатывают заполнение полей более непосредственно, чем использование подклассов, подобных этому, но это полностью зависит от типа данных, которые вы получаете и обрабатываете.
Как правило, класс должен иметь только один набор обратных вызовов до/после. Некоторые из этих обратных вызовов могут запускаться условно, если определение обратного вызова поддерживает объявление стиля :if
. Иногда вам нужно написать свои собственные before_validation
подпрограммы для удовлетворения ваших более экзотических требований.
person
tadman
schedule
11.02.2013