我有两个before_validation回调。先执行哪一个?

时间:2015-04-27 20:23:32

标签: ruby-on-rails validation

这是我的公司模型,它具有地理编码功能。基本上,我想确保在地理编码方法之前调用add_full_address方法,因为地理编码方法依赖于full_address。我如何让它工作?验证是否按顺序运行?我需要它们在验证运行之前发生,因为我想验证是否填充了纬度和经度列,否则......我希望保存失败。

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+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i, }

  validates :latitude , numericality: { greater_than_or_equal_to:  -90, less_than_or_equal_to:  90 }
  validates :longitude, numericality: { greater_than_or_equal_to: -180, less_than_or_equal_to: 180 }

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

  geocoded_by :full_address do |obj, results|
    if geo = results.first
      obj.latitude = geo.latitude
      obj.longitude = geo.longitude
    end
  end

  def add_full_address
    self.full_address = "#{city}, #{state}"
  end

  def d3_coordinates
    slice(:longitude, :latitude)
  end
end

2 个答案:

答案 0 :(得分:1)

根据文档,验证器按照定义的顺序执行。

所有before_validation回调都将在任何验证器之前调用

答案 1 :(得分:1)

看看这个:ActiveRecord::CallBacks这将为您提供所有可以使用的回调。 ruby也是一种同步语言,它将从上到下运行,但当然回调在这种情况下的验证之前运行。