Rails, MongoID и встроенные отношения - PullRequest
4 голосов
/ 22 марта 2012

У меня есть несколько вопросов о MongoID и встроенных отношениях в Rails.

В моей модели у меня есть:

class Board
  include Mongoid::Document

  attr_accessible :title

  field :title, :type => String

  #has_and_belongs_to_many :users
  embeds_many :items
end

, когда я звоню

Board.all

itвозвращает всю коллекцию, включая также: items.

Я читал во многих статьях / форумах, что использование встроенных отношений MongoDB предпочтительнее ссылочных, но у меня есть несколько вопросов:

  • А как насчет выступлений?каждый раз, когда я хочу получить доску, я также извлекаю элементы внутри нее: иногда это может быть полезно, но в случае, если мне нужна только информация о доске, а не предметы внутри нее, я должен создать новый метод, чтобы не извлекать элементы.
  • Когда я хочу обновить элемент, БД перезагрузит весь документ, а не только элемент, который я хочу получить, верно?

До сих пор я заметил, что единственное преимущество виспользование встроенного документа для чего-то вроде того, что в SQL называется «объединением», но я также вижу много проблем с производительностью, есть важная причина для использования встроенных отношений над ссылочными отношениями?

EDIT

Как указал Адам С, мои мысли высвобождаются в ситуациях, подобных этим:

, как было объяснено ранее, у меня будет каждый Совет с множеством Предметов внутри него и с использованием лесов Rails генерирует методы, которые получаютвесь документ Правления из базы данных, но много раз (например, при редактировании Правления) я хочу загрузитьдокумент без части Items.

Поскольку я буду использовать в основном вызовы JSON, моя идея заключалась в том, чтобы добавить в URL необязательный параметр, такой как "? get_items", который должен быть установлен в TRUE, если я также хочу получить элементыв других ситуациях я бы использовал Mongoid:

Model.without

Например, давайте возьмем действие index:

  def index
    @boards = Board.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @boards }
    end
  end

Мне нужно будет получить только поля, указанные в модели платы (в этомтолько для случая: название) без элементов, поэтому я могу использовать:

  def index
    @boards = Board.without :items

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @boards }
    end
  end

Что вызывает у меня некоторые проблемы?

1 Ответ

11 голосов
/ 22 марта 2012

Если вам нужно получить элементы по отдельности, вам не следует их вставлять.

Мои эмпирические правила:

  1. Доменные объекты верхнего уровня (вещи, с которыми вы работаете самостоятельно, которые не всегда появляются в контексте их «родителя») должны получать свои собственные коллекции.

  2. Вставить, когда связанные вещи

    а. Не расти неограниченно. То есть в отношении 1-N N ограничено.

    б. Всегда (или почти всегда) появляются вместе с родителями.

  3. Вы также можете встраивать, если можете доказать себе, что улучшения производительности, достигаемые за счет вложения, перевешивают затраты на многочисленные запросы, необходимые для получения всех объектов.

Ни встраивание, ни связывание не должны быть предпочтительными. Их следует рассматривать одинаково.

...