gpt4 book ai didi

ruby-on-rails - 在 Rails 中将 DATETIME 字段设置为零日期

转载 作者:行者123 更新时间:2023-12-04 06:09:28 24 4
gpt4 key购买 nike

我有一个通过 ActiveRecord 管理 MySQL 数据库的 Rails 应用程序。我在该数据库中有一个 DATETIME 列,我想将其设置为 zero date . (不是 NULL,零日期。向下滚动该页面以了解我的意思。)

看起来很简单,但我不知道如何在不使用原始 SQL 的情况下实现这一点。

以下是我已经尝试过的一些方法:

  • field = 0 (因 ActiveRecord 错误 Column 'field' cannot be null 失败)
  • field = "0000-00-00" (失败并出现错误 undefined method 'year' for nil:NilClass )
  • field = DateTime.parse("0000-00-00") (因 DateTime 错误 invalid date 失败)

  • 有没有办法通过 ActiveRecord 做到这一点,或者我会被迫为此使用原始 SQL?

    编辑:我不允许改变我的 SQL 数据库的结构来解决这个问题。这是工作的事...

    最佳答案

    看起来像 "default: 0"做你想要的:

    class CreateAnothers < ActiveRecord::Migration
    def change
    create_table :anothers do |t|
    t.date :start, null: false, default: 0
    t.timestamps null: false
    end
    end
    end

    😉 ➤ rake db:migrate
    == 20150813201736 CreateAnothers: migrating ===================================
    -- create_table(:anothers)
    -> 0.0943s
    == 20150813201736 CreateAnothers: migrated (0.0944s) ==========================

    [1] pry(main)> Another.create
    (0.2ms) BEGIN
    SQL (0.5ms) INSERT INTO `anothers` (`created_at`, `updated_at`) VALUES ('2015-08-13 20:19:02', '2015-08-13 20:19:02')
    (34.6ms) COMMIT
    => #<Another:0x0000000ab8eb38 id: 1, start: nil, created_at: Thu, 13 Aug 2015 15:19:02 CDT -05:00, updated_at: Thu, 13 Aug 2015 15:19:02 CDT -05:00>

    mysql> select * from anothers;
    +----+------------+---------------------+---------------------+
    | id | start | created_at | updated_at |
    +----+------------+---------------------+---------------------+
    | 1 | 0000-00-00 | 2015-08-13 20:20:14 | 2015-08-13 20:20:14 |
    +----+------------+---------------------+---------------------+
    1 row in set (0.00 sec)

    明确要求后

    那么,换句话说,你的目标是什么?您想通过 rails 运行更新来修改您的表吗?如果是这样,你可以这样做
     ActiveRecord::Base.connection.execute("UPDATE table SET field='0000-00-00' WHERE id=#{self.id}")

    允许吗? (是的)

    更新

    好吧,如果你想要纯 Rails,那就这样吧:
    [5] pry(main)> a.update_attribute(:start, nil)
    (1.5ms) BEGIN
    SQL (3.6ms) UPDATE `anothers` SET `start` = NULL, `updated_at` = '2015-08-14 16:31:22' WHERE `anothers`.`id` = 1
    (36.8ms) COMMIT
    => true
    [6] pry(main)> a.update_attribute(:start, "0000-00-00")
    (0.2ms) BEGIN
    (0.1ms) COMMIT
    => true

    mysql> select * from anothers;
    +----+-------+---------------------+---------------------+
    | id | start | created_at | updated_at |
    +----+-------+---------------------+---------------------+
    | 1 | NULL | 2015-08-14 16:30:39 | 2015-08-14 16:31:22 |
    +----+-------+---------------------+---------------------+
    1 row in set (0.00 sec)

    如您所见,update_attribute 不起作用,但是
    [8] pry(main)> a.update_column(:start, "0000-00-00")
    SQL (47.1ms) UPDATE `anothers` SET `anothers`.`start` = '0000-00-00' WHERE `anothers`.`id` = 1
    => true

    mysql> select * from anothers;
    +----+------------+---------------------+---------------------+
    | id | start | created_at | updated_at |
    +----+------------+---------------------+---------------------+
    | 1 | 0000-00-00 | 2015-08-14 16:30:39 | 2015-08-14 16:31:22 |
    +----+------------+---------------------+---------------------+
    1 row in set (0.00 sec)

    update_column 做!

    请注意,在您执行 a.update_column(:start, "0000-00-00") 之后,变量上的日期字段(在我的情况下为“a.start”)将设置为“0000-00-00”。如果你想让它显示实际的 nil 值,你需要重新加载它,比如 a.reload .

    关于ruby-on-rails - 在 Rails 中将 DATETIME 字段设置为零日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31947625/

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