2011-09-26 151 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模型之間的關係,並確定合適的外鍵 ,現在一切工作正常。