Mongoid:如何将一周内的日期模拟为嵌入式文档?

时间:2012-03-06 22:35:18

标签: ruby mongodb mongoid

我正在学习如何使用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对这些对象进行适当建模?

2 个答案:

答案 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,并在其上放置一个日期字段。当您想要显示一周的任务时,只需获取该周的日期落在的所有任务。