2014-01-17 2 views
1

У меня есть следующие модели, определенные в Rails, с Mongoid:Создание встроенных документов, как представляется, не создают отношения

Class Character 
    include Mongoid::Document 
    field :n, as: name, type: String 
    field :p, as: :positions, type: Array 
    field :o, as: :roles, type: Array 
    field :r, as: :resource, type: String 
    embeds_one :base_stat 
end 

class BaseStat 
    include Mongoid::Document 
    embedded_in :character 
end 

Я пытаюсь посеять свою базу данных с документами, которые имеют эти отношения 1), потому что Я должен был бы в конце концов и 2), поэтому я могу проверить, правильно ли использую Mongoid. Я пробовал несколько разных способов его засеять, но каждый раз я могу создавать персональные документы, а затем создавать документы BaseStat на основе символьного документа, но вызов character.base_stat возвращает нуль.

Вот вещи, которые я пробовал в дб/seeds.rb, что не бросаете ошибки:

ch = Character.create!([etc]) 
ch.build_base_stat([etc]) 

Character.create!(name: value, name: value, base_stat: BaseStat.new(name: value, name:value)) 

ch = Character.create!([etc]) 
ch.create_base_stat([etc]) 

Я также попытался с помощью ch.base_stat.create! (что вызвало ошибку, когда я назвал rake db: setup).

Я знаю, что созданы как документы Character, так и BaseStat, потому что я могу выполнять поиск в консоли Rails для семенных документов Character (a = Character.where (name: value) [0] и b = BaseStat.where (имя: значение) [0]). Но похоже, что отношения не хранятся.

Вызов a.metadata также вызывает NoMethodError.

У меня нет никаких контроллеров, только модели и записи в db/seeds.rb. Я чувствую, что мне не хватает чего-то фундаментального, потому что, ну, я охотился через StackOverflow и не видел ничего, что фиксировало это.

Версии: Mongoid 4.0.0.alpha2 Rails 4.0.1

ответ

2

Вы пробовали очень простой тест? Вы можете открыть консоль рельсов, создать символ, сохранить его, а затем добавить к нему BaseStat и сохранить его?

c = Character.new 
b = BaseStat.new 
b.name = "test" 
c.base_stat = b 
c.save 
c 

Отпечатывает ли ваша новая запись встроенный BaseStat? Если это так, то должно быть что-то не так с синтаксисом или методом в семенах.

+0

Weird! Оно делает. В настоящее время у меня есть только одно семя. Не могли бы вы взглянуть на него? 'Character.create! (N:« Aatrox », p: [" top "," jungle "], o: [" offtank "," glass cannon "], r:" health ", stats: BaseStat.new (hp: 395, hp18: 1925, hpr: 5,75, hpr18: 14,75, ad: 55, ad18: 112,6, as: 0,651, as18: 0,983, ar: 14, ar18: 82,4, mr: 30, mr18: 52,5, мс : 345, r: 150)) ' (Я изменил модель персонажа, так что это embeds_one: stats, class_name" BaseStat. "Модель BaseStat по-прежнему встроена: символ) –

+0

Предполагая, что у вас есть все эти поля, добавленные в модель BaseStat, кажется верьте мне. После запуска этого семени вы сможете обнаружить, что BaseStat, выполнив Character.first.stats, работает ли это?Я не думаю, что данные о взаимоотношениях должны храниться для встроенных документов. Это больше похоже на псевдосвязь. –

+0

Нет, вызов Character.first.stats возвращает nil. Странно. (Character.first действительно возвращает правильный результат.) –

0

Цитирование Mongoid документы, это может быть, почему:

Одно из различий между ядром Mongoid и Active Record с поведенческой точки зрения является то, что Mongoid не автоматически сохранять дочерние отношения для реляционных ассоциаций. Это по соображениям производительности.

Попробуйте добавить autosave: true к вашему base_stat соотношению:

embeds_one :base_stat, autosave: true 
Смежные вопросы