gpt4 book ai didi

ruby-on-rails - Rails 地理编码模型中的两种方式

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:07 25 4
gpt4 key购买 nike

我正在使用地理编码器并有一个名为 Location 的模型。此模型包含经度、纬度和地址。我想要的是让用户选择填写经纬度或地址。如果其中一个已填满,则填写其余信息。所以这是我所做的

  before_validation :check
def check
if self.address.blank?
reverse()
else
geo()
end
end

def reverse
reverse_geocoded_by :latitude, :longitude,
:address => :address
after_validation :reverse_geocode
end

def geo
geocoded_by :address
after_validation :geocode
end

但我收到以下未定义的方法 reverse_geocoded_by 我不知道该怎么做!

最佳答案

您不能在实例方法中调用类方法。请记住,geocoded_by 可能是为您的模型类定义的。您不能在不影响模型的所有实例的情况下任意更改一个实例的验证,因此这通常被视为一个坏主意。

您最好拥有一个可以通过两种不同方式之一进行地理编码的“位置”模型,并为每种编码类型创建一个子类。也就是说,可以为这些中的每一个独立地建立规则。使用单表继承 (STI) 可以轻松存储这些内容。

所以你可以:

class Location < ActiveRecord::Base
end

class ForwardLocation < Location
geocoded_by :address
after_validation :geocode
end

class ReverseLocation < Location
reverse_geocoded_by :latitude, :longitude,
:address => :address
after_validation :reverse_geocode
end

然后您将相应地添加适当的位置:

self.location = self.address? ? ReverseLocation.create(...) : ForwardLocation.create(...)

您还可以编写方法来更直接地处理填充字段,而不必像这样使用子类,但这完全取决于您接收和处理的数据类型。

通常,一个类应该只有一组前后回调。如果回调定义支持 :if 样式声明,它可以有条件地触发其中一些回调。有时您需要编写自己的 before_validation 例程来处理更奇特的要求。

关于ruby-on-rails - Rails 地理编码模型中的两种方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14804651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com