1

JSONDB のようにシリアライズしたい約 10 個の属性を持つモデルがあります。

方法はありますか:

serialize attribute1, JSON
// ...
serialize attribute10, JSON

一行で?serialize [attribute1, ..., attribute10], JSONうまくいかないからです。

ありがとう!

4

4 に答える 4

8

ここで何をしようとしているのかによって、実際にはstoreの方が適しているかもしれません:

store :settings, accessors: :attr1, :attr2, :attr3

Rails は単一の列を使用して複数の属性を保存 (およびシリアル化) します。また、それぞれの属性に対してアクセサーを定義するため、個々の列のようにアクセスできます。

私がこれを提案する理由は、ほとんどのリレーショナル データベースは特別なことを何もしないため、データベース内の個別の列を使用することで追加の価値が得られる可能性は比較的低いためです。アプリケーションはより効率的であり、同様に処理する必要がある別の項目を追加するときに、DB に列を追加し続ける必要はありません。

このパターンを使用して、ユーザーに関連するソーシャル URL を保存します。次のネットワークが登場したら、アクセサーとフォーム フィールドを追加するだけで準備完了です。移行は必要ありません。


ちなみに、Rails 4 は使用するエンコーダーの指定もサポートしています。すなわち:

store :settings, accessors: [ :attr1, :attr2, :attr3 ], coder: JSON
于 2013-06-25T15:48:39.563 に答える
1

申し訳ありませんが、ドキュメントによると、これが箱から出してすぐに可能かどうかはわかりません:

http://apidock.com/rails/ActiveRecord/AttributeMethods/Serialization/ClassMethods/serialize

それ以外の場合は、おそらく ActiveRecord をオーバーライドして、やりたいことを実行するモジュールを作成できます。

于 2013-06-13T21:04:06.977 に答える
0

user1376019推奨に従って、私が使用したソリューションは次のとおりです。

json_exclusions = ["id", "column_not_serialized"]
YourModel.column_names.reject{|col| json_exclusions.include?(col)}.each{|attr| serialize attr, JSON}

私が使用しているモデルの属性の大部分はシリアル化されているため、このルートに進みましたが、シリアル化された属性を直接リストする方が効率的であることに気付くかもしれません。

于 2013-06-25T15:38:51.867 に答える
0

利便性が本当に価値がある場合は、これをよりエレガントに処理する新しいメソッドを定義できます。

module SerializeAll
  def serialize_all(*columns)
    store = columns.last.is_a?(Module) ? columns.pop : JSON

    columns.each do |column|
      serialize column, store
    end
  end
end

class Model < ActiveRecord::Base
  extend SerializeAll
  serialize_all :attr1, :attr2, :attr3, JSON
end

serializeこれは、スプラットを考慮した場合と同じアリティを持ちますが、多少混乱します。serialize_allRuby(およびRails)の他の多くのメソッドとより一貫性のある実装の別の方法はextract_options!、存在する場合に配列の末尾からハッシュを取得するを使用することです。

def serialize_all(*columns)
  options = columns.extract_options!
  # ... serialize(column, options[:store])
end

serialize_all :attr1, :attr2, :attr3, store: JSON

ほとんどの場合、単なる好みの問題です。また、アプリケーションの他の場所でこれを使用している場合は、先に進んで に含めることもできますActiveRecord::Base

于 2013-06-27T16:53:01.877 に答える