如何将PostgreSQL的DataMapper字符串长度设置为无限制

时间:2011-06-20 02:27:45

标签: ruby postgresql datamapper

当然,人们可以在整个地方使用property :foo, Text, lazy: false替换property :foo, String,但当然,这可以一次性击败几个目的。或者我可以使用我一直在做的手动迁移 - 我现在环顾四周,看看它们是否最终会被废弃,就VARCHAR诉TEXT而言。

换句话说,我想自动为PostgreSQL创建TEXT字段,用于具有String属性的模型,而不是任意,毫无意义,在TEXT上限制VARCHAR。

2 个答案:

答案 0 :(得分:0)

Postgres adapter似乎能够处理它:

# size is still required, as length in postgres behaves slightly differently
def size
  case self.type
  #strings in postgres can be unlimited length
  when :string then return (@options.has_key?(:length) || @options.has_key?(:size) ? @size : nil)
  else nil
  end
end

未经测试的建议,但考虑到source of initialize及其正下方的长度函数,请尝试传递nil作为长度,或者根本没有长度。

答案 1 :(得分:0)

这是我提出的一个糟糕但有效的解决方案 - 如果你更好的话请添加它,我会接受它。

config/initializers/postgresql_strings.rb

module DataMapper
  module Migrations
    module PostgresAdapter
      def self.included(base)
        base.extend ClassMethods
      end

      module ClassMethods

        def type_map
          precision = Property::Numeric.precision
          scale     = Property::Decimal.scale

          super.merge(
            Property::Binary => { :primitive => 'BYTEA' },
            BigDecimal => { :primitive => 'NUMERIC', :precision => precision, :scale => scale },
            Float => { :primitive => 'DOUBLE PRECISION' },
            String => { :primitive => 'TEXT' } # All that for this
          ).freeze
        end
      end

    end
  end
end

# If you're including dm-validations, it will surprisingly attempt
# to validate strings to <= 50 characters, this prevents that.
DataMapper::Property::String.auto_validation(false)