ActiveRecord中的自定义数据库类型

我正在使用Rails 3.1.1和PostgreSQL 9.1以及earthdistance模块 。 为了能够正确计算不同位置之间的距离,我在branches表中设置了一个带有earth类型的列。

我现在遇到的问题是我的Rails应用程序使用此表不理解地球类型,因此我在我的db/schema.rb得到这个:

  #由于遵循StandardError,无法转储表“分支”
 #列'位置'的未知类型'earth' 

这是有问题的,因为现在我无法从schema.rb创建我的测试数据库。

如何将此类型添加到AR或使其忽略该列?

试试这个:

改变你的config / application.rb

 config.active_record.schema_format = :sql 

这会将输出格式更改为本机PostgreSQL SQL格式,schema.rb将被禁用,并将生成一个新文件/db/config/structure.sql

有人可能遇到这种情况的另一种情况是将自定义postgres类型(枚举)插入postgresql。 如果执行此操作并仍希望将Ruby用于schema.rb,则可以将自定义数据库类型添加到适配器的有效类型列表中。

例如,假设你有一个像这样的迁移,有一个address_typeaddress_status

 class CreateAddresses < ActiveRecord::Migration def up execute <<-SQL CREATE TYPE address_status AS ENUM ('active', 'archived'); CREATE TYPE address_type AS ENUM ('billing', 'shipping'); SQL create_table :customer_addresses do |t| # bla bla t.column :address_type, :address_type t.column :status, :address_status t.timestamps null: false end end def down drop_table :customer_addresses execute <<-SQL DROP TYPE address_type; DROP TYPE address_status; SQL end end 

然后在创建初始化程序或向您的application.rb添加这样的内容:

 # config/initializers/postres_enum_custom_types.rb module ActiveRecord module ConnectionAdapters if const_defined?(:PostgreSQLAdapter) class PostgreSQLAdapter NATIVE_DATABASE_TYPES.merge!( address_status: { name: 'character varying' }, address_type: { name: 'character varying' } ) end end end end 

关于我解决方案的说明

  • 我正在检查PostgreSQLAdpater的存在,因为我正在使用的静态分析gem部分加载一些AR依赖项 - 特别是gem annotate
  • 原始定义的来源在这里 。

遇到这样的背景:当我在rails 5.0.x中发生这种情况时,迁移运行正常,但是当我尝试运行db:test:preparedb:reset时,我的测试环境会失败。 我花了很长时间才将其跟踪到架构转储问题。