【问题标题】:Why does my created_on field get changed when I update a record?为什么更新记录时我的 created_on 字段会发生变化?
【发布时间】:2010-08-01 00:05:04
【问题描述】:

当我在 Rails 中保存公寓记录时,由于某种原因,它正在更新 updated_on 字段 created_on 字段。我无法弄清楚 created_on 字段是如何/为什么被更新的。

为了尝试调试这种情况,我打开了一个控制台窗口并执行了以下操作

t = Apartment.find(11619)
t.beds = 4
t.save

当我检查我的日志文件时,我看到以下内容

   SQL (0.0ms)   BEGIN
   Apartment Load (0.0ms)   SELECT `apartments`.id FROM `apartments` WHERE (`apartments`.`unit_num` = BINARY '2005' AND `apartments`.building_id = 17755 AND `apartments`.id <> 11619) LIMIT 1
   Apartment Load (0.0ms)   SELECT * FROM `apartments` WHERE (`apartments`.`id` = 11619) 
   Apartment Update (0.0ms)   UPDATE `apartments` SET `beds` = 4.0, `updated_on` = '2010-07-31 19:54:10' WHERE `id` = 11619
   SQL (0.0ms)   COMMIT

这仅显示更改的 updated_on 字段!

所以我想问题是,什么可以更改我的 created_on 值但不会显示在 rails 日志文件中?

编辑:我知道 created_on 字段正在更改,因为当我执行 sql 查询检查时,该值已更新为与 updated_on 字段相同。另外,我向我的用户显示 created_on 值,这正是引起我注意的原因。

EDIT2:表定义如下。我似乎通过将默认值从“CURRENT_TIMESTAMP”更改为“0000-00-00 00:00:00”解决了我的问题,但我不明白为什么这会有所作为?

Field   Type    Null    Key Default Extra
id  int(10) unsigned    NO  PRI \N  auto_increment
building_id int(10) unsigned    YES MUL 0   
unit_num    varchar(45) YES         
beds    float   YES MUL \N  
rent    int(10) unsigned    YES MUL 0   
date_available  date    YES     \N  
on_market   tinyint(1)  YES     0   
floor   varchar(10) YES     \N  
fee_paid    int(10) YES     0   
note    blob    YES     \N  
created_by  int(10) unsigned    YES     1   
updated_by  int(10) unsigned    YES     1   
created_on  timestamp   NO      CURRENT_TIMESTAMP   
updated_on  timestamp   NO      0000-00-00 00:00:00 
lease_expiration_date   date    YES     \N  
on_market_date  date    YES     \N  
off_market_date date    YES     \N  
tenant_name varchar(40) YES     \N  
tenant_number   varchar(40) YES     \N  
baths   float   YES     1   
public_note blob    YES     \N  
public_title    text    YES     \N  
key_note    blob    YES     \N  
status  varchar(40) YES     Off Market  
app_pending tinyint(1)  YES     0   
app_pending_date    date    YES     \N  

【问题讨论】:

  • 是什么让您认为您的 created_on 字段正在发生变化?
  • 我的猜测是默认约束:dev.mysql.com/doc/refman/5.0/en/timestamp.html
  • 我知道 created_on 字段正在发生变化,因为当我执行 sql 查询检查时,该值已更新为与 updated_on 字段相同。此外,我向我的用户显示 created_on 值,这正是引起我注意的原因。
  • 你应该发布你的表定义。听起来好像您的 created_on 列正在使用 ON UPDATE 选项。
  • 在 MySQL 中运行SHOW TRIGGERS 的输出是什么?

标签: mysql ruby-on-rails


【解决方案1】:

您为什么不使用 created_at/updated_at (rails 会为您处理这些)?

2008 年 Ruby 论坛上关于此的讨论是 here

在 Rails 中使用 DATETIME 来做这些事情似乎更好。

【讨论】:

  • created_on/updated_on 的处理方式与 created_at/updated_at 相同,rails 目前正在更新我的字段
【解决方案2】:

根据 Chris Henry 的建议,我查看了我的表定义并将默认值从“CURRENT_TIMESTAMP”更改为“0000-00-00 00:00:00”。这解决了问题,虽然我不明白为什么这会对我的情况产生影响

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2013-05-31
    • 2022-11-27
    • 1970-01-01
    • 2021-08-27
    • 2012-06-17
    相关资源
    最近更新 更多