Монгоидные модели пространства имен и наследование - PullRequest
2 голосов
/ 26 сентября 2011

Я пытаюсь использовать модели пространства имен с Mongoid и не могу заставить его работать.

У меня есть следующие модели: Achievement, Flag, FlagCaptured

Достижение - это базовый класс для FlagCaptured.

Приложение / модели / achievement.rb

class Achievement
    include Mongoid::Document
    include Mongoid::Timestamps::Created

    belongs_to :team
end

приложение / модели / flag.rb

class Flag
    include Mongoid::Document

    field :name,  :type => String
    field :key,   :type => String, :default => SecureRandom.base64
    field :score, :type => Integer

    belongs_to :achievement, :class_name => "Achievements::FlagCaptured"

    validates :name,  :presence => true, :uniqueness => true
    validates :key,   :presence => true, :uniqueness => true
    validates :score, :presence => true, :numericality => { :only_integer => true }

    def captured?
        !achievement_id.nil?
    end
end

приложение / модели / достижения / flag_captured.rb

module Achievements
    class FlagCaptured < Achievement
        has_one :flag, :foreign_key => :achievement_id, :autosave => true

        def score
            self.flag.score
        end
    end
end

Я создаю достижение FlagCaptured в консоли следующим образом:

Achievements::FlagCaptured.create(:flag => Flag.first, :team => Team.first)

Теперь достижение будет создано, и я могу получить его:

Achievements::FlagCaptured.first

Однако ни одна из сторон отношения не установлена.

So

Achievements::FlagCaptured.first.flag

ноль

и

Achievements::FlagCaptured.first.flag_id

выдает ошибку NoMethodError.

Далее оба:

Flag.first.achievement

Flag.first.achievement_id

ноль.

Что здесь происходит? Я перепробовал все, что мог придумать (установка внешних ключей, указание имен классов, указание обратного отношения), и ничего не работает. (

1 Ответ

3 голосов
/ 02 октября 2011

Оказывается, мне нужно было добавить

:autosave => true

к отношению в модели FlagCaptured и определите правильный внешний ключ и теперь все работает нормально.

...