Получение доступа к объекту владельца ассоциации - PullRequest
1 голос
/ 16 июля 2011

Я хочу получить доступ к владельцу ассоциации elements в следующем коде внутри модуля Processor.Сначала вызывается Chapter.process:

app / models / chapter.rb

class Chapter
  include Mongoid::Document
  field :position, :type => Integer
  field :title, :type => String
  field :identifier, :type => String

  embedded_in :book
  embeds_many :elements

  def self.process!(git, file)
    chapter = new
    # Parsing of XML goes here, generating parsed_doc
    elements = parsed_doc.css("div.chapter > *")
    elements.each { |element| chapter.elements.process!(element) }
  end

Затем он передается коду внутри Processor, которыйфактически включается в класс Element следующим образом:

app / models / element.rb

class Element
  include Mongoid::Document
  extend Processor
  field :tag, :type => String
  field :identifier, :type => String
  field :title, :type => String

  embedded_in :chapter
end

Где класс Processor определяется следующим образом:

module Processor

  def process!(markup)
    [ASSOCIATION OWNER GOES HERE].elements.send("process_#{markup.name}!", markup)
  end

Причина, по которой мне это нужно, заключается в том, что я попытался просто вызвать send сам по себе, но Monogid настаивает на том, чтобы:

Доступ к коллекции для элемента неразрешено, так как это встроенный документ, пожалуйста, получите доступ к коллекции из корневого документа.

И поэтому единственный способ сделать это - получить доступ к родительскому объекту для этой ассоциации.Я знаю, что должен быть _parent метод для экземпляров документа, но в этом случае этот метод вызывается для collection , а не для экземпляра.

Так как я могуссылаться на объект ассоциации из этого process! метода?

Ответы [ 2 ]

1 голос
/ 16 июля 2011

С Mongoid вы не можете делать это так, как вы предлагаете, до создания родительского объекта, так как глава еще не сохраняется, когда вы вызываете self.process !, у вас нет «корневого документа». Единственный способ заставить это работать с учетом ваших ограничений - это вызвать self.process! из фильтра after_create после создания объекта главы.

1 голос
/ 16 июля 2011

Проблема здесь в том, что вы расширяете модуль, поэтому self будет ссылаться на класс вместо экземпляра элемента.Если вы измените модуль для включения в Element или любым другим способом сделаете метод process! методом экземпляра, вы можете сделать self.chapter.elements.

В случае, если элемент может быть встроен в другие модели, кроме главы self._parent.elements будет лучшим выбором, но я бы не рекомендовал его, поскольку он не задокументирован и может измениться в будущих версиях mongoid без уведомления.

...