Rails关联触摸始终编辑updated_at,尽管某些内容未更改

时间:2012-11-18 20:41:48

标签: ruby-on-rails activerecord

我在Rails关联中遇到严重的touch指令问题。

始终编辑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

自动编辑updated_at

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。这是错误的。

1 个答案:

答案 0 :(得分:1)

rails touch指令很可能在同名Unix工具的已建立和预期行为之后松散地建模。

根据文件记载,它没有被打破。

如果它没有做你想做的事情,那可能是错误的做法。


来自documentation at RailsAPI

  

触摸(名称=无)

     

使用设置为当前的updated_at / on属性保存记录   时间。请注意,未执行验证且没有回调   执行。如果传递属性名称,则该属性为   与updated_at / on属性一起更新。

关于Linux的触摸的男人描述:

  

:触摸(1)

     

描述   将每个FILE的访问和修改时间更新为当前时间。


如果您认为这是错误的行为,您可以自由提交补丁或报告错误。