【问题标题】:How to add a database domain in Activerecord without executing a raw SQL query?如何在不执行原始 SQL 查询的情况下在 Activerecord 中添加数据库域?
【发布时间】:2019-01-29 22:03:58
【问题描述】:

我想创建一个数据库域,比如这个:

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

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

我的设置是 PostgreSQL 9.6 和 Rails 5.0。

我希望有一个类似enable_extension (docs) 或create_trigger 的方法,如hair_trigger gem (link)。

【问题讨论】:

  • 执行原始 SQL 有什么问题?
  • 我曾经和ActiveRecord::Migration.execute(query_string)运行相同
  • 原始 SQL 不会反映在 schema.rb 中
  • 好的,这个answer 提供了一个很好的选择:将查询添加到seeds.rb,因为它是rails db:setup 的一部分。不过,这需要进行测试。

标签: ruby-on-rails ruby rails-activerecord


【解决方案1】:

我认为最好的方法是为此使用原始 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 任务,如此处所述answer

【讨论】:

  • 不幸的是,这两个问题都没有回答。最重要的是,它并没有解决将上述更改添加到 schema.rb 的问题。我赞成您的回答,因为我承认 rake 任务可以作为一种解决方法,尽管它不方便并且因此可能会被搞砸(例如,经过很长一段时间后或者如果项目得到另一个团队)。
  • @TimurNugmanov 我同意,但我认为这是您目前的最佳选择。您也可以尝试config.active_record.schema_format = :sql 这应该使迁移反映在架构文件上,但我宁愿使用我的默认架构格式
  • 一旦您开始需要特定于数据库的功能,您就需要将switchschema.rb 转换为db/structure.sql。除了将schema_format 切换为:sql 之外,还有更多内容,但不多。顺便说一句,如果你 change 只是一个 reversible 调用,单独的 updown 方法可能会更清晰,并且会使用更少的缩进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
相关资源
最近更新 更多