当然,人们可以在整个地方使用property :foo, Text, lazy: false
替换property :foo, String
,但当然,这可以一次性击败几个目的。或者我可以使用我一直在做的手动迁移 - 我现在环顾四周,看看它们是否最终会被废弃,就VARCHAR诉TEXT而言。
换句话说,我想自动为PostgreSQL创建TEXT字段,用于具有String属性的模型,而不是任意,毫无意义,在TEXT上限制VARCHAR。
答案 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)