我在Rails关联中遇到了触摸指令的严重问题。
它总是在时间戳处编辑updated_at。这很奇怪,因为当关联的对象没有改变时,总是更新时间戳。
放置
class Place < ActiveRecord::Base
has_one :location, inverse_of: :place, dependent: :destroy
attr_accessible :name
attr_accessible :location_attributes
accepts_nested_attributes_for :location
end
和位置
class Location < ActiveRecord::Base
belongs_to :place, inverse_of: :location, touch: true
attr_accessible :number, :street, :locality, :region, :postal_code, :country, :description, :description_en, :latitude, :longitude
attr_accessible :place_id
validates :place, presence: true
validates :number, presence: true
validates :street, presence: true
validates :locality, presence: true
validates :postal_code, presence: true, postal_code: { country: :sk }
validates :latitude, presence: true, numericality: true, allow_nil: true
validates :longitude, presence: true, numericality: true, allow_nil: true
end
当我加载并保存已存在的地方而没有更改时:
Place.last.save # changed? == false
它自动编辑上的更新
SQL (0.4ms) UPDATE `places` SET `updated_at` = '2012-11-18 20:38:48' WHERE `places`.`id` = 490
有人对此有经验吗?如何修复它?
使用Rails 3.2.9和MySQL(mysql2适配器)
编辑:
Location.last.save更改为Place.last.save。这是错误的。
railstouch
指令可能是松散地按照Unix同名工具的既定和预期行为建模的。
根据文件,它没有坏。
如果它没有做你想让它做的事情,那很可能是错误的方法。
来自RailsAPI:的文档
触摸(name=nil)
保存属性设置为当前的updated_at/on的记录时间请注意,没有执行任何验证,也没有回调执行。如果传递了属性名称,则该属性为与属性上的updated_at/on一起更新。
Linux上触摸的男人描述:
TOUCH(1)
说明将每个FILE的访问和修改时间更新为当前时间。
如果你真的认为这是错误的行为,你可以自由提交补丁或报告错误。