我有这个对象:
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
此模型“序列化”吗?
答案 0 :(得分:0)
并非所有Ruby类都可以开箱即用,但幸运的是,Hashes是可以成为的类之一。因此,没有理由为它们编写自己的序列化。但如果你这样做并且速度有所提高,那么它将是最小的。序列化主要用于持久化具有自定义数据类型的字段。
它不会加速您的数据库,但如果您真的想节省空间,您可以为全布尔哈希创建自定义类型并将您的哈希序列化为bitcode。您可以根据要序列化数据的方式创建自定义类并定义mongoize
实例方法和mongoize
,demongoize
和evolve
类方法。是的,这绝对是可能的。然而,在实践中,实现起来很麻烦,除非你的哈希值与模型中的其他数据相比很大,否则不会为你节省太多空间。
根据您的情况,更容易节省空间的方法是缩短所有字段名称,如下所示:
field :wno, as: :when_new_order, :type => Boolean, :default => "true"
field :wco, as: :when_cancel_order, :type => Boolean, :default => "true" ...
由于在数据库中为存储的每个文档重复字段名称,因此长字段名称将开始占用大量额外空间。由于您传递了别名,例如:when_new_order
,那么你的模型将完全像以前一样。