0

私はこのオブジェクトを持っています:

class MessageSetting
  include Mongoid::Document
  include Mongoid::Timestamps::Created

  #relationships
  embedded_in :user
  field :when_new_order, :type => Boolean, :default => "true"
  field :when_cancel_order, :type => Boolean, :default => "true"
  field :when_expire_order, :type => Boolean, :default => "true"
  field :when_reject_order, :type => Boolean, :default => "true"
  field :when_accept_order, :type => Boolean, :default => "true"
  field :when_in_progress_overtime, :type => Boolean, :default => "true"
  field :when_is_canceled_due_overtime, :type => Boolean, :default => "true"
  field :when_deliver_order, :type => Boolean, :default => "true"
  field :when_order_complete, :type => Boolean, :default => "true"
  field :when_open_dispute, :type => Boolean, :default => "true"
  field :when_buyer_request_refund, :type => Boolean, :default => "true"
  field :when_seller_made_refund, :type => Boolean, :default => "true"
  field :when_seller_made_dispute_response, :type => Boolean, :default => "true"
  field :when_buyer_made_dispute_response, :type => Boolean, :default => "true"

  attr_accessible :when_new_order, :when_cancel_order, :when_expire_order, :when_reject_order,
                  :when_accept_order, :when_in_progress_overtime, :when_is_canceled_due_overtime,
                  :when_deliver_order, :when_deliver_order, :when_order_complete, :when_open_dispute,
                  :when_buyer_request_refund, :when_seller_made_refund, :when_seller_made_dispute_response, :when_buyer_made_dispute_response

  def active_new_order?
   when_new_order?
  end

  def active_when_cancel_order?
   when_cancel_order?
  end

  def active_when_expire_order?
   when_expire_order?
  end

  def active_when_reject_order?
   when_reject_order?
  end

  def active_when_accept_order?
   when_accept_order?
  end

  def active_when_in_progress_overtime?
   when_in_progress_overtime?
  end

  def active_when_is_canceled_due_overtime?
   when_is_canceled_due_overtime?
  end

  def active_when_deliver_order?
   when_deliver_order?
  end

  def active_when_order_complete?
   when_order_complete?
  end

  def active_when_open_dispute?
   when_open_dispute?
  end

  def active_when_buyer_request_refund?
   when_buyer_request_refund?
  end

  def active_when_seller_made_refund?
   when_seller_made_refund?
  end

  def active_when_seller_made_dispute_response?
   when_seller_made_dispute_response?
  end

  def active_when_buyer_made_dispute_response?
   when_buyer_made_dispute_response?
  end

end

次のようにして、mongoidで「シリアル化」できることを知っています。

field :status_message_setting, type: Hash

それから私はできる:

m = MessageSetting.new
m.status_message_setting = {:when_new_order => true, :when_cancel_order => false, ...}
m.save

パフォーマンス、ベスト プラクティス、および利用可能なリソースを参照する必要がありますhash。このモデルで「シリアル化」する方がよいでしょうか?

4

1 に答える 1

0

すべての Ruby クラスをすぐにシリアライズできるわけではありませんが、幸運なことに、ハッシュはシリアライズできるクラスの 1 つです。したがって、独自のシリアル化を作成する理由はありません。しかし、そうして速度が上がると、それは最小限になります。シリアライゼーションは、主にカスタム データ型のフィールドを永続化するために使用されます。

データベースの速度は向上しませんが、本当にスペースを節約したい場合は、すべてブール値のハッシュのカスタム タイプを作成し、ハッシュをビットコードにシリアル化できます。カスタム クラスを作成し、データをシリアル化する方法に応じて、mongoizeインスタンス メソッド、mongoizedemongoize、およびクラス メソッドを定義します。evolveはい、これは間違いなく可能です。ただし、実際には、ハッシュがモデル内の残りのデータと比較して巨大でない限り、実装するのは面倒であり、それほど多くのスペースを節約することはできません。

あなたの状況では、スペースを節約するためのより簡単な方法は、次のようにすべてのフィールド名を短くすることです。

field :wno, as: :when_new_order, :type => Boolean, :default => "true"
field :wco, as: :when_cancel_order, :type => Boolean, :default => "true" ...

フィールド名は保存されているドキュメントごとにデータベース内で繰り返されるため、長いフィールド名は多くの余分なスペースを占有し始めます。たとえば、エイリアスを渡すため:when_new_order、モデルは以前とまったく同じように動作します。

于 2013-02-01T04:58:31.347 に答える