我将天数 0-6 存储在文档的数组中。
我希望文件始终按正确的顺序排列,但星期天(0)会造成麻烦,因为它会在星期一(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: 我最终创建了第二个字段 sortable_days,我使用了序列化程序,但没有使用反序列化程序,然后改为在该字段上进行排序。