2

テーブル内のjsonフィールドを管理するRails 2アプリがあります。次のことが必要です。

  • json を読む
  • json をモデル属性とフォーム フィールドに変換する
  • フォーム フィールドへの編集を json フィールドに保存する
  • 一部の json 値の検証を追加します
  • 複数のモデルに適用可能

現在、次のように、json に抽出して保存するメソッドを手動で追加するライブラリ ファイルがあります。

module Configuration
  def configuration_json
    configuration? ? JSON.parse(self.configuration) : {}
  end

  def some_json_value
    if !self.configuration.nil? && configuration_json["parentKey"]
      configuration_json["parentKey"]["someJsonValue"]
    end
  end

  def some_json_value=(val)
    new_config = configuration_json.deep_merge({
      "FeatureConfiguration" => { "someJsonValue" => val }
    })
    self.configuration = new_config.to_json
  end

  def some_json_value_validation
    # ...
  end
end

モデルにはこれを含めます

class SomeModel < ActiveRecord::Base
  include Configuration
  validate :some_json_value_validation

  # ...
end

より良い/ドライな方法はありますか? 現在、json 構造が変更されると非常に扱いにくく、レール アプリで変更する手順がかなりあります。

Railsアプリがサポートするメインアプリケーションである別のアプリケーションの構成のためであるため、jsonフィールドの使用を変更することはできません。

4

1 に答える 1

1

最善の方法は、構成モデルto_jsonを作成し、正しい json オブジェクトを構築するメソッドを単純に作成することです。

本当に json を解析してすべての操作で元に戻したい場合は、次のようにメソッドを作成するヘルパーを作成できます。json_attr_accessor

例:

module Configuration

  def configuration_json
    configuration.present? ? JSON.parse(configuration) : {}
  end

  module ModelExtensions

    def json_attr_accessor(*symbols)
      symbols.each do |sym|

        key = sym.to_s.camelize(:lower)

        define_method(sym) do
          ['FC', key].reduce(configuration_json) do |json, key|
            json and json[key]
          end
        end

        define_method("#{sym}=") do |val|
          hash = configuration_json.deep_merge 'FC' => { key => val }
          self.configuration = hash.to_json
        end

      end
    end

  end

  def self.included(base)
    base.extend ModelExtensions
  end

end

そしてモデルでは:

class SomeModel < ActiveRecord::Base
  include Configuration
  json_attr_accessor :some_json_value
end

カスタムバリデータのヘルプへのリンクは次のとおりです。

http://www.perfectline.ee/blog/building-ruby-on-rails-3-custom-validators

于 2013-03-03T22:47:42.127 に答える