【问题标题】:Rails add_column with a limit and default with Postgres FunctionRails add_column 有限制,默认使用 Postgres 函数
【发布时间】:2016-04-12 17:34:12
【问题描述】:

我正在尝试添加一列,该列默认为生成的 UUID,没有连字符作为 varchar(32)。目前这是我的迁移:

add_column :users, :uuid, :string, limit: 32, default: "REPLACE(uuid_generate_v4(), '-', '')"

但它似乎出错了,因为它只是将其设置为字符串文本:

PG::StringDataRightTruncation: ERROR: value too long for type character varying(32)

我似乎找不到关于为 sql 语句设置默认值的适当文档,但在 Rails 5 中可能更简单 (https://github.com/rails/rails/pull/20005)

【问题讨论】:

    标签: ruby-on-rails postgresql ruby-on-rails-4 postgres-9.4


    【解决方案1】:

    更新

    嗯,我能够找到你的答案。 Active Record(显然)有一些特定于 postgresql 的支持。如果您使用的是 postgresql 9.4+ 和 Active Record,则可以在架构中使用 UUID。 There's an official Rails guide that describes how to do it here.

    原始回复

    我不知道如何在数据库级别进行设置,但是您可以像这样为 Active Record 模型 using a callback 添加一个默认值:

    class Model < ActiveRecord::Base
      before_create do
        if self.uuid.nil?
          self.uuid = REPLACE(uuid_generate_v4(), '-', '')
        end
      end
    end
    

    【讨论】:

    • 会运行吗?我的示例是 postgres 函数而不是 ruby​​,但我在 ruby​​ 中执行此操作的方式是在 before_create (因此只运行一次)和 self.uuid ||= SecureRandom.uuid.gsub("-", "")|| 以便您可以选择手动设置)。我最感兴趣的是能够在 postgres 方面做到这一点
    • 你是完全正确的,之前验证不起作用,因为它也会在更新时触发。我不知道该功能,我只是从您的示例中复制。话虽如此,由于您使用的是 postgresql(正如您的错误声明所证明的那样),我找到了您的解决方案并更新了我的答案。
    • 哇,通读所有链接,Active Record 实际上支持很多 postgresql 特定功能。
    • 既然你明明有一些sql知识,难道你不知道我之前发的这个问题的答案吗? stackoverflow.com/questions/36580266/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多