2015-04-23 53 views
0

我想對地址進行地址解析,我試圖對名爲full_address的非持久屬性進行地理編碼。這裏是我的代碼:rails中before_save回調的順序

class Company < ActiveRecord::Base 
    include ActiveModel::Dirty 

    validates :name, :organization, :title, :state, :city, presence: true 
    validates :email, presence: true, length: { maximum: 255 }, 
        format: { with: /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i, } 

    before_save :full_address 
    geocoded_by :full_address 

    before_save :geocode, if: ->(obj){obj.full_address.present? && (obj.city_changed? || obj.state_changed?)} 

    def full_address 
    "#{city}, #{state}" 
    end 
end 

 我不知道如果我的before_save回調以正確的順序發射的。基本上,我如何確保

before_save :full_address 

之前發生火災?

我看着around_save文檔,但我仍然不確定它在做什麼。

回答

1

Jwan -

AR回調被用於很多原因,他們是處理在數據庫中記錄特別有幫助,但你並不需要一個在這裏爲「full_address」。爲什麼?

因爲它所做的只是返回一個字符串,不對數據庫執行任何操作或以任何方式更改數據。

自從我與geocoder gem合作已經有一段時間了,但在其他before_save回調函數中,您正在傳遞一個lambdha進行條件操作。

兩件事情:

1)你檢查的插值字符串的存在,但證實兩個插值屬性的存在,回調前的時候觸發,所以obj.full_address.present?應該總是返回true,因爲它會吹如果兩個或甚至其中一個屬性不存在,則進行驗證。嘗試

before_save :geocode, if: ->(obj){ obj.city_changed? || obj.state_changed? }

+1雖然加載ActiveModel上髒::執行! 2)除非你使用的是舊版本的Rails或者明確地配置它,否則,ActiveModel::Dirty是自動加載的;不需要line 2

3.)我也會嘗試使用after_validation回調,而不是before_save。不能保證會解決問題,但它在回調堆棧中是較早的。參考http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html