【问题标题】:Using NOW() in rails migration在 Rails 迁移中使用 NOW()
【发布时间】:2021-03-22 21:40:58
【问题描述】:

有没有办法可以使用 NOW() + INTERVAL 1 创建迁移

class AddFields < ActiveRecord::Migration[5.2]
  def change
    add_column :campaign_groups, :start_at, :datetime, null: false, defaut:->{NOW()}
    add_column :campaign_groups, :end_at, :datetime, null: false, default:->{NOW() + INTERVAL 1 DAY}
  end
end

当我运行 rake db:migrate 时,出现语法错误:

syntax error, unexpected tINTEGER, expecting do or '{' or '('
default:->{NOW() + INTERVAL 1 DAY}

【问题讨论】:

    标签: ruby-on-rails date rails-migrations


    【解决方案1】:

    是的,有。 now() your'e 使用的是数据库解释的数据库函数,而不是 Ruby 代码。您想将 now()now() + interval '1 day' 放入数据库,因此您的 lambdas 需要返回字符串:

    default: -> { 'now()' }
    default: -> { "now() + interval '1 day'" }
    

    PS:您在:start_at 选项中的default:(原为:defaut)中有错字。

    AFAIK now()now + interval '1 day' 表达式是 PostgreSQL 特定的。如果您使用的是 MySQL,那么您会想要使用 current_timestampcurrent_timestamp + interval 1 day

    default: -> { 'current_timestamp' }
    default: -> { 'current_timestamp + interval 1 day' }
    

    【讨论】:

    • 我收到了错误:Mysql2::Error: You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '+ interval '1 day' NOT NULL' 附近使用正确的语法: ALTER TABLE campaign_groups ADD end_at datetime DEFAULT now() + interval '1 day ' 非空
    • 抱歉,不知道您使用的是 MySQL(以为是 PostgreSQL)。我已经更新了一些应该与 MySQL 一起使用的东西。重点是 lambdas 需要返回字符串。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多