#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 => "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
любой совет был бы высоко оценен!
Ответ №1:
Вы ссылаетесь на класс Team
при определении Coach
, но класс еще не существует. У вас есть два варианта:
- Объявите
class_name
как строку вместо константы, например,:class_name => 'Team'
(предпочтительно, см. Суть) - Полностью удалите
:class_name => Team
опцию и позвольте Mongoid определить правильные классы, участвующие в ассоциации. Есть одно предостережение: вам нужно будет убедиться, что классTeam
объявлен перед классомCoach
(порядок загрузки ваших исходных кодов теперь имеет значение, поэтому это решение не идеально)
Комментарии:
1. 1 к ответу выше, если кто-нибудь видит ошибку, в которой он жалуется на NoMethodError, то это, скорее всего, связано с проблемой загрузки. Объявление class_name в виде строки решает проблему.