Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用has\u one将一个对象与同一类的两个不同对象关联的Mongoid_Ruby On Rails_Mongodb_Mongoid - Fatal编程技术网

Ruby on rails 使用has\u one将一个对象与同一类的两个不同对象关联的Mongoid

Ruby on rails 使用has\u one将一个对象与同一类的两个不同对象关联的Mongoid,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我在1:N中看到了这类问题的解决方案,但他们似乎没有理解为1:1,这是使用MongoDB 1.8、Mongoid 2.0.0.rc.8、Rails 3.0.5 class Coach include Mongoid::Document field :name, :type => String belongs_to :coached, :class_name => Team, :inverse_of => :coach, :foreign_key =>

我在1:N中看到了这类问题的解决方案,但他们似乎没有理解为1:1,这是使用MongoDB 1.8、Mongoid 2.0.0.rc.8、Rails 3.0.5

class Coach  
  include Mongoid::Document 
  field :name, :type => String 
  belongs_to :coached, :class_name => Team, :inverse_of => :coach, :foreign_key => "coach_id" 
  belongs_to :assisted, :class_name => Team, :inverse_of => :assist, :foreign_key => "assist_id" 
end 


class Team 
  include Mongoid::Document 
  field :name, :type => String 
  has_one :coach, :class_name => Coach, :inverse_of => :coached 
  has_one :assist, :class_name => Coach, :inverse_of => :assisted 
end 
然后启动Rails控制台会话并执行以下操作:

irb(main):001:0> c = Coach.new(:name => "Tom")  
=> #<Coach _id: da18348d298ca47ad000001, _type: nil, _id: BSON::ObjectId('4da18348d298ca47ad000001'), name: "Tom", coach_id: nil, assist_id: nil> 

irb(main):002:0> a = Coach.new(:name => "Dick") 
=> #<Coach _id: 4da18352d298ca47ad000002, _type: nil, _id: BSON::ObjectId('4da18352d298ca47ad000002'), name: "Dick", coach_id: nil, assist_id: nil> 

irb(main):003:0> t = Team.new(:name => "Allstars") 
=> #<Team _id: 4da18362d298ca47ad000003, _type: nil, _id: BSON::ObjectId('4da18362d298ca47ad000003'), name: "Allstars"> 

irb(main):005:0> t.coach = c 
NoMethodError: undefined method `constantize' for Coach:Class 

irb(main):005:0> c.coached = t 
NoMethodError: undefined method `constantize' for Team:Class 
irb(main):001:0>c=Coach.new(:name=>“Tom”)
=> # 
irb(main):002:0>a=Coach.new(:name=>“Dick”)
=> # 
irb(主):003:0>t=Team.new(:name=>Allstars)
=> # 
irb(主):005:0>t.coach=c
NoMethodError:Coach:Class的未定义方法“constantize”
irb(主):005:0>c.coached=t
NoMethodError:Team:Class的未定义方法“constantize”

任何建议都将不胜感激

在定义
Coach
时,您引用的是类
Team
,但该类尚不存在。 您有两个选择:

  • class\u name
    声明为字符串而不是常量,例如
    :class\u name=>“Team”
    (首选,请参阅)
  • 完全删除
    :class_name=>Team
    选项,让Mongoid找出参与关联的正确类有一个警告:您需要确保在类
    Coach
    之前声明类
    团队
    (加载源代码的顺序现在很重要,因此此解决方案并不理想)

+1对于上述答案,如果有人看到它抱怨NoMethodError的错误,那么它很可能与加载问题有关。将class_name声明为string解决了这个问题。