Mongoid: Как смоделировать дни недели как внедренные документы? - PullRequest
0 голосов
/ 07 марта 2012

Я учусь, как использовать монго с рубином, используя самоцвет монгоид. Я создаю простое приложение todo как учебный опыт. Я моделирую каждую неделю, только с понедельника по пятницу, у каждого из которых есть много вещей, которые можно сделать. Мой документ будет выглядеть примерно так:

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

Как правильно моделировать эти объекты, используя монгоид?

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Полагаю, вы правы, предполагая, что выборка одного документа более эффективна, чем выборка 15, но вы должны иметь в виду, что документ корневого уровня - это единица измерения квантов, которую вы получите из 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 голос
/ 07 марта 2012

Я бы не стал хранить день и неделю в базе данных. Я хотел бы иметь одно задание коллекции / класса и поместить в него поле даты. Если вы хотите показать, что такое задачи на неделю, просто возьмите все задачи, даты которых выпадают на эту неделю.

...