在Ruby on Rails中使用PostgreSQL注解简化枚举类型标识

j91ykkif  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(82)

我正在使用Ruby on Rails,目前在尝试辨别PostgreSQL列中表示枚举类型的数值的含义时面临着一个挑战。为了进行说明,我有一个stage列,其中包含类似{0:删除,1:直播,2:暂停,3:enqueued,.},我正在寻找一种方法,可以在数据库IDE(如Datagrip)中轻松识别这些关联。
有没有一种方法可以自动生成PostgreSQL注解?

wr98u20j

wr98u20j1#

您可以使用迁移来添加注解。例如

class AddCommentsToStatusColumn < ActiveRecord::Migration[7.0]
  def up
    comment_text = <<-SQL
      COMMENT ON COLUMN jobs.status IS 
      'Enum: 0 => removed, 1 => live, 2 => suspended, 3 => enqueued';
    SQL

    execute(comment_text)
  end

  def down
    execute("COMMENT ON COLUMN jobs.status IS NULL;")
  end
end

或者,如果你想为多个枚举自动化这一点,你可以使用一个rake任务。您可以修改此设置以使用多个模型。这样,每次更新枚举时,都可以重新运行此rake任务来相应地更新注解。

namespace :db do
  desc "Add enum comments"
  task enum_comments: :environment do
    comment_text = Job.defined_enums.map do |name, values|
      value_mappings = values.map { |k, v| "#{v} => #{k}" }.join(", ")
      <<-SQL
        COMMENT ON COLUMN jobs.#{name} IS 'Enum: #{value_mappings}';
      SQL
    end.join("\n")

    ActiveRecord::Base.connection.execute(comment_text)
  end
end

rake任务有两个缺点。
1.不像迁移那样进行版本控制
1.你要记得运行它
移民也有其不利的一面。
1.可能是矫枉过正的东西,如添加评论
1.每次更改都需要一个新的迁移文件

我原来的错误答案:

如果表中有一个整数列,例如status。然后你可以这样写一个枚举
选项1:

enum status: { removed: 0, live: 1, suspended: 2, enqueued: 3 }

备选方案二:

enum status: [:removed, :live, :suspended, :enqueued]

相关问题