2011-09-26 109 views
2

我正在尝试在Mongoid中使用命名空间模型,并且似乎无法使其工作。Mongoid命名空间模型和继承

我有以下型号:成就,国旗,FlagCaptured

Achievment是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 

然而,关系的任何一方都不设置。

所以

Achievements::FlagCaptured.first.flag 

是零

Achievements::FlagCaptured.first.flag_id 

给人以NoMethodError。

另外两个:

Flag.first.achievement 

Flag.first.achievement_id 

是零。

这是怎么回事? 我试过了我能想到的所有东西(设置外键,指定类名,指定反向关系)并且没有任何效果。 :(

+0

不应该'类FlagCaptured rubish

+0

是的,我忘记把它放在上面的示例代码中,对不起。 –

回答

3

原来,我需要

:autosave => true 

添加到在FlagCaptured模型之间的关系,并确定合适的外键 ,现在一切工作正常。