Как проверить, изменился ли какой-либо атрибут в модели

У меня есть модель адреса, которая содержит поля: number, street, city, post_code.

Я использую метод под названием fulladdress для интерполяции всех полей в одно, которое затем передается геокодеру, который возвращает долготу и широту для адреса.

Вот моя модель адреса:

class Address < ActiveRecord::Base
    belongs_to :user

    def fulladdress
        "#{number} #{street}, #{city}, #{post_code}"
    end

    geocoded_by :fulladdress
    after_validation :geocode, :if => :number_changed?

end

На данный момент геокодер обновляет долготу и широту только в том случае, если number изменилось. Я хочу, чтобы геокодер запускался, если какое-либо из number, street, city, post_code изменений. Каков наилучший способ сделать это?


person blackfish64    schedule 17.08.2014    source источник


Ответы (1)


Я никогда не работал с геокодером, но если вы просто хотите что-то обновить при изменении атрибутов, вы можете настроить обратный вызов after_save.

class Address < ActiveRecord::Base
    belongs_to :user

    def fulladdress
        "#{number} #{street}, #{city}, #{post_code}"
    end

    geocoded_by :fulladdress
    after_save :geocode

end

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

person tehfailsafe    schedule 17.08.2014
comment
Я не думаю, что это будет работать для геокода, потому что геокод берет :fulladdress и вычисляет широту и долготу адреса и заполняет поля :latitude и :longitude в модели адреса. Когда код изменяется, как указано выше, поля широты и долготы остаются пустыми при сохранении. Если я оставлю это как after_validation :geocode, то это сработает, однако меня интересует, как вы будете запускать геокодирование только тогда, когда поле в адресном объекте изменилось. - person blackfish64; 18.08.2014
comment
Поскольку в адресе есть только те поля, которые находятся в :fulladdress, я не понимаю вопроса. Каждый раз, когда модели сохраняются, обновляются или проверяются, это означает, что одно из полей в :fulladdress изменилось. Если модель адреса не имеет больше полей, которые вы не показываете? - person tehfailsafe; 18.08.2014