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_type
和address_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依赖项 - 特别是gemannotate
。 - 原始定义的来源在这里 。
我遇到这样的背景:当我在rails 5.0.x中发生这种情况时,迁移运行正常,但是当我尝试运行db:test:prepare
或db:reset
时,我的测试环境会失败。 我花了很长时间才将其跟踪到架构转储问题。