这是我的公司模型,它具有地理编码功能。基本上,我想确保在地理编码方法之前调用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
答案 0 :(得分:1)
根据文档,验证器按照定义的顺序执行。
所有before_validation回调都将在任何验证器之前调用
答案 1 :(得分:1)
看看这个:ActiveRecord::CallBacks这将为您提供所有可以使用的回调。 ruby也是一种同步语言,它将从上到下运行,但当然回调在这种情况下的验证之前运行。