2011-06-20 20 views
1

の代わりにを使用すると、property :foo, Stringを置き換えることができますが、もちろんいくつかの目的を一通り破ります。それとも私がやって - 私はしてきた。TEXTが懸念しているVARCHAR Vとして限り、彼らは最終的に放棄することが可能かどうかを確認するために、今周りを探し、マニュアルの移行を、使用することができます。PostgreSQLのDataMapper文字列の長さを無制限に設定する方法

つまり、TEXTの上に任意に、無意味な制約のあるVARCHARではなく、Stringプロパティを持つモデル用にPostgreSQL用のTEXTフィールドを作成するようにautomigrateしたいと思います。 Postgres adapter

答えて

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) 
0

は、それを処理することができるように思わ:

# 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を渡してみてください。

+0

私が試しええ、それは少数の一つであったスローそれ-と-来て見-IF-バックアイデアは:)長さの効果に何かして戻ってくるのである必要があります整数または範囲。いかなる長さは、私たちに50あるデフォルトの長さを取得していません!それは無制限であるべきであり、その旨のバグは長い時間前に解決として閉鎖されたが、それはそれで作らなかったり、途中で失われてしまったのどちらか。 –

+0

また、続編を使用してみてください。はるかに強力な私は(cursorily)テストしてきた限り、 - あなたはSQLを理解していれば1をはるかに自然な感じ。それはwith-queriesとトリガー関数をサポートします。 –

関連する問題