首页 > 解决方案 > 如何在不执行原始 SQL 查询的情况下在 Activerecord 中添加数据库域?

问题描述

我想创建一个数据库域,例如,像这样:

CREATE DOMAIN colour AS VARCHAR CHECK (VALUE IN ('red', 'green', 'blue'));

如何在 Rails Activerecord 中执行此操作而不在迁移中执行原始 SQL 查询?
另一个问题是,如何在 schema.rb 中反映域创建?
有什么宝石吗?

我的设置是 PostgreSQL 9.6 和 Rails 5.0。

我希望有一种方法,如enable_extensiondocs)或create_triggerhair_trigger gem (link)。

标签: ruby-on-railsrubyrails-activerecord

解决方案


我认为最好的方法是为此使用原始 SQL 编写迁移

class ExampleMigration < ActiveRecord::Migration
  def change
    reversible do |dir|
      dir.up do
        # create color ype
        execute <<-SQL
          CREATE DOMAIN colour AS VARCHAR CHECK (VALUE IN ('red', 'green', 'blue'));
        SQL
      end

      dir.down do
        # drop color type
        execute <<-SQL
          DROP DOMAIN colour;
        SQL
      end
    end
  end
end

然后您可以设置一个运行这些迁移的 rake 任务,如此处所述


推荐阅读