我正在学习如何使用mongoid gem来使用mongo和ruby。我创建了一个简单的待办事项应用程序作为学习体验。我每个星期都在建模,只有星期一到星期五,每个都有许多待办事项。我的文件看起来像这样:
week = {
'year': 2012,
'week': 10,
'monday': [
{'task': 'take out the trash', 'effort_points': 1},
{'task': 'build a house', 'effort_points': 5}
],
'tuesday': [],
'wednesday': [],
'thursday': [],
'friday': []
}
到目前为止,我有一些看起来像这样的类(其中一些可能是伪代码):
class Week
include Mongoid::Document
field :year, type: Integer
field :week, type: Integer
embeds_one :day, as: :monday
embeds_one :day, as: :tuesday
embeds_one :day, as: :wednesday
embeds_one :day, as: :thursday
embeds_one :day, as: :friday
end
class Day
include Mongoid::Document
embedded_in :week
embeds_many :items
end
class Item
include Mongoid::Document
embedded_in :day
field :task
field :effort_points
end
如何使用mongoid对这些对象进行适当建模?
答案 0 :(得分:2)
我猜你是正确的,假设获取一个文档比获取15更有效,但你必须记住,根级文档是你将从db获取的quanta的单位。因此,如果您将一周中的几天保存在单个文档中,则必须从db中获取一周,即使您需要单个任务。
另一种方法是将日期模型如下:
class Week
include Mongoid::Document
field :year, type: Integer
field :week, type: Integer
embeds_many :days
end
class Day
include Mongoid::Document
field :day, type: String
embedded_in :week
embeds_many :items
validates :day, :in => [:monday, tuesday, ....]
end
它还有一个额外的好处,那就是当你想看看几周有哪些与咖啡有关的任务时,你可以查询:
Week.where("days.items.task" => /coffeee/i).all
# Instead of
Week.all.or("monday.items.task" => /coffee/i).or("tuesday.items.task: => /coffee/i)...
它主要是有意义的,因为周是根文档,但如果你需要独立完成每一天的任务,那么你可能会把它作为一个单独的集合。
PS:想要发表评论但是太长了。答案 1 :(得分:1)
我不会在数据库中保留日期和星期。我会有一个集合/类Task,并在其上放置一个日期字段。当您想要显示一周的任务时,只需获取该周的日期落在的所有任务。