Mongoid, связывающий один объект с двумя различными объектами одного и того же класса с помощью has_one - PullRequest
4 голосов
/ 13 апреля 2011

У меня есть решения для такого рода проблем с 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 Console и:

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 

любой совет будет очень признателен!

1 Ответ

8 голосов
/ 14 апреля 2011

Вы ссылаетесь на класс Team при определении Coach, но класс еще не существует.У вас есть два варианта:

  • Объявить class_name как строку вместо константы, например :class_name => 'Team' (предпочтительно, см. gist )
  • Полностью удалить:class_name => Team и пусть Mongoid определит правильные классы, участвующие в ассоциации. Существует одно предупреждение: Вам необходимо убедиться, что класс Team объявлен перед классом Coach (порядок загрузки ваших исходных кодов теперь имеет значение, поэтому это решение не является идеальным)
...