ドキュメントの配列に0〜6日の番号を格納しています。
ドキュメントを常に正しい順序にしたいのですが、sunday(0)は、monday(1)より前になるため、面倒です。この注文を別の方法で行うにはどうすればよいですか?
default_scope asc(:days)
アップデート:
したがって、カスタムシリアル化を実装しようとすると、問題が発生しました。
class Schedule
include Mongoid::Document
field :days, type: Days
default_scope order_by([[:days, :asc]])
end
class Days
include Mongoid::Fields::Serializable
# Convert Ruby wday format, sunday(0) - saturday(6).
def deserialize(days)
days.map { |day| (day + 1)%7 }
end
# Convert to MongoDB friendly format, monday(0) - sunday(6).
def serialize(days)
days.map { |day| (day + 6)%7 }
end
end
これまでのところ、カスタムフィールドのシリアル化は期待どおりに機能します。
s2 = Schedule.create(days: [0])
s.days
# Deserialized value => [0]
s.read_attribute :days
# Stored value => [6]
しかし、Mongoidは逆シリアル化されたオブジェクトでソートしているようですか?
s2 = Schedule.create(days: [1,2,3,4,5])
s2.days
# Deserialized value => [1, 2, 3, 4, 5]
s2.read_attribute :days
# Stored value => [0, 1, 2, 3, 4]
Schedule.all
# Sorted as => [s1, s2]
# Expected sort order => [s2, s1]
デシリアライズを削除して確認すると、ドキュメントが正しい順序で返されます。これは埋め込みドキュメントであることに注意する価値があるかもしれません。おそらく、順序付けは別の方法で行われていると思います。
更新2: 最終的に2番目のフィールドsortable_daysを作成しました。これは、シリアライザーを使用しましたが、デシリアライザーは使用せず、代わりにそのフィールドでソートしました。