0

Railsアプリを作成する際に、文字列テーブルの列幅が必要になる場所がいくつかあります。検証、RSpecテスト、入力フォームなどです。DBでも文字列の長さ制限を設定する価値があるようです。

現在、モデルにLENGTHSハッシュを設定しているので、他の場所の長さにアクセスして、この点でコードをDRYに保つことができます。DBで長さ制限を設定した場合、そこから値を読み取って(または、それらを使用してLENGTHSハッシュを初期化して)、コードをさらにDRYにすることはできますか?つまり、モデル内のデータベース列の文字列の長さの制限を読み取って使用できるようにするためのコードは何ですか?

4

2 に答える 2

1

ARモデルのcolumnsメソッドにアクセスできます。

Model.columns.map(&:limit)
Model.columns.map(&:name)
Model.columns.map(&:null)
Model.columns.map(&:sql_type)
...

したがって、このメソッドを使用して、ハッシュ/配列/その他を構築できます。あなたが話している属性の長さは、この表記法では限界だと思います。

于 2012-06-12T20:34:20.963 に答える
0
class ActiveRecord::Base
  def self.method_missing(method_id, *args)
    if self.columns_hash.has_key?(method_id.to_s)
      self.columns_hash[method_id.to_s]
    else
      super
    end
  end
end

これにより、によって提供される任意の列スキーマデータcolumns_hashにクリーンな方法でアクセスできます。したがって:

Model.column_name利用可能なすべてのデータのハッシュを返します

Model.column_name.hash_key関心のある1つの値を返します

例: 列Company.contact_name.limitの最大長を返しcontact_nameます。私が読んだところによると、DBは起動時にスキーマデータをロードするため、DBヒットは発生せcolumns_hashず、データを記憶します。

于 2012-06-13T05:51:42.583 に答える