Mongoid будет управлять ссылками на документы и запросами для вас, просто не забудьте указать связь/отношения для каждого необходимого вам направления (например, User has_many: notes AND Note принадлежит_to: user). Как и ActiveRecord, он выглядит «умным» в отношении отношений. Пожалуйста, не ручайте ссылки вручную, но вместо этого пусть ваш ODM (Mongoid) работает для вас. Когда вы запускаете свои тесты (или используете консоль rails), вы можете использовать tail -f log/test.log (или log/development.log), чтобы узнать, какие операции MongoDB выполняются Mongoid для вас, и вы можете увидеть фактический объект ссылки при обновлении документов. Вы можете видеть, как отношения используют конкретную ссылку на объект, и если вы обратите внимание на это, оптимизация ссылок должна стать яснее.
Следующие модели и тестовые работы для меня. Подробности по установке доступны по запросу. Надеюсь, что это поможет.
Модели
class User
include Mongoid::Document
field :name
has_many :notebooks
has_many :notes
end
class Note
include Mongoid::Document
field :text
belongs_to :user
belongs_to :notebook
end
class Notebook
include Mongoid::Document
belongs_to :user
has_many :notes
end
Тестовые
require 'test_helper'
class UserTest < ActiveSupport::TestCase
def setup
User.delete_all
Note.delete_all
Notebook.delete_all
end
test "user" do
user = User.create!(name: 'Charles Dickens')
note = Note.create!(text: 'It was the best of times')
notebook = Notebook.create!(title: 'Revolutionary France')
user.notes << note
assert_equal(1, user.notes.count)
user.notebooks << notebook
assert_equal(1, user.notebooks.count)
notebook.notes << note
assert_equal(1, notebook.notes.count)
puts "user notes: " + user.notes.inspect
puts "user notebooks: " + user.notebooks.inspect
puts "user notebooks notes: " + user.notebooks.collect{|notebook|notebook.notes}.inspect
puts "note user: " + note.user.inspect
puts "note notebook: " + note.notebook.inspect
puts "notebook user: " + notebook.user.inspect
end
end
Результат
Run options: --name=test_user
# Running tests:
user notes: [#<Note _id: 4fa430937f11ba65ce000002, _type: nil, text: "It was the best of times", user_id: BSON::ObjectId('4fa430937f11ba65ce000001'), notebook_id: BSON::ObjectId('4fa430937f11ba65ce000003')>]
user notebooks: [#<Notebook _id: 4fa430937f11ba65ce000003, _type: nil, user_id: BSON::ObjectId('4fa430937f11ba65ce000001'), title: "Revolutionary France">]
user notebooks notes: [[#<Note _id: 4fa430937f11ba65ce000002, _type: nil, text: "It was the best of times", user_id: BSON::ObjectId('4fa430937f11ba65ce000001'), notebook_id: BSON::ObjectId('4fa430937f11ba65ce000003')>]]
note user: #<User _id: 4fa430937f11ba65ce000001, _type: nil, name: "Charles Dickens">
note notebook: #<Notebook _id: 4fa430937f11ba65ce000003, _type: nil, user_id: BSON::ObjectId('4fa430937f11ba65ce000001'), title: "Revolutionary France">
notebook user: #<User _id: 4fa430937f11ba65ce000001, _type: nil, name: "Charles Dickens">
.
Finished tests in 0.018622s, 53.6999 tests/s, 161.0998 assertions/s.
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
Mongoid (для MongoDB ODM) не поддерживает через –
Ах, извините. Не видел этого немного о Монго. Тогда проигнорируйте. – CambridgeMike