2015-04-23 50 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