JSON
DB のようにシリアライズしたい約 10 個の属性を持つモデルがあります。
方法はありますか:
serialize attribute1, JSON
// ...
serialize attribute10, JSON
一行で?serialize [attribute1, ..., attribute10], JSON
うまくいかないからです。
ありがとう!
JSON
DB のようにシリアライズしたい約 10 個の属性を持つモデルがあります。
方法はありますか:
serialize attribute1, JSON
// ...
serialize attribute10, JSON
一行で?serialize [attribute1, ..., attribute10], JSON
うまくいかないからです。
ありがとう!
ここで何をしようとしているのかによって、実際にはstoreの方が適しているかもしれません:
store :settings, accessors: :attr1, :attr2, :attr3
Rails は単一の列を使用して複数の属性を保存 (およびシリアル化) します。また、それぞれの属性に対してアクセサーを定義するため、個々の列のようにアクセスできます。
私がこれを提案する理由は、ほとんどのリレーショナル データベースは特別なことを何もしないため、データベース内の個別の列を使用することで追加の価値が得られる可能性は比較的低いためです。アプリケーションはより効率的であり、同様に処理する必要がある別の項目を追加するときに、DB に列を追加し続ける必要はありません。
このパターンを使用して、ユーザーに関連するソーシャル URL を保存します。次のネットワークが登場したら、アクセサーとフォーム フィールドを追加するだけで準備完了です。移行は必要ありません。
ちなみに、Rails 4 は使用するエンコーダーの指定もサポートしています。すなわち:
store :settings, accessors: [ :attr1, :attr2, :attr3 ], coder: JSON
申し訳ありませんが、ドキュメントによると、これが箱から出してすぐに可能かどうかはわかりません:
http://apidock.com/rails/ActiveRecord/AttributeMethods/Serialization/ClassMethods/serialize
それ以外の場合は、おそらく ActiveRecord をオーバーライドして、やりたいことを実行するモジュールを作成できます。
user1376019
推奨に従って、私が使用したソリューションは次のとおりです。
json_exclusions = ["id", "column_not_serialized"]
YourModel.column_names.reject{|col| json_exclusions.include?(col)}.each{|attr| serialize attr, JSON}
私が使用しているモデルの属性の大部分はシリアル化されているため、このルートに進みましたが、シリアル化された属性を直接リストする方が効率的であることに気付くかもしれません。
利便性が本当に価値がある場合は、これをよりエレガントに処理する新しいメソッドを定義できます。
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_all
Ruby(および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
。