【问题标题】:How to check if any attribute has changed on a model如何检查模型上的任何属性是否已更改
【发布时间】:2014-08-17 14:34:23
【问题描述】:

我有一个包含以下字段的地址模型:number, street, city, post_code。

我使用一种名为fulladdress 的方法将所有字段插入一个,然后将其传递给地理编码器,该地理编码器返回地址的经度和纬度。

这是我的地址模型:

class Address < ActiveRecord::Base
    belongs_to :user

    def fulladdress
        "#{number} #{street}, #{city}, #{post_code}"
    end

    geocoded_by :fulladdress
    after_validation :geocode, :if => :number_changed?

end

目前,地理编码器仅在 number 发生变化时更新经度和纬度。如果number, street, city, post_code 发生任何变化,我想要的是地理编码器运行。执行此操作的最佳实践方法是什么?

【问题讨论】:

    标签: ruby-on-rails-4 model rails-geocoder dirty-data


    【解决方案1】:

    我从未使用过地理编码器,但如果您只是想在属性更改时更新某些内容,您可以设置一个 after_save 回调。

    class Address < ActiveRecord::Base
        belongs_to :user
    
        def fulladdress
            "#{number} #{street}, #{city}, #{post_code}"
        end
    
        geocoded_by :fulladdress
        after_save :geocode
    
    end
    

    这应该会在地址更新时强制它更新,这应该意味着至少有一个属性已更改,因此无需检查它们是否不同。

    【讨论】:

    • 我认为这不适用于地理编码,因为地理编码采用:fulladdress 并计算地址的纬度和经度,并在地址模型上填写:latitude 和:longitude 字段。如上所述更改代码时,纬度和经度字段在保存时保持为空。如果我将其保留为after_validation :geocode,那么它可以工作,但是我对仅当地址对象上的字段发生更改时如何运行地理编码感兴趣。
    • 由于地址只有:fulladdress 中的字段,我不明白这个问题。每次模型保存、更新或验证时,这意味着 :fulladdress 中的字段之一已更改。除非地址模型有更多你没有显示的字段?
    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多