2012-05-03 4 views
0

Предположим, у меня есть модель-разработчик под названием «Пользователь», которая имеет_имя :notes и :notebooks и каждый :notebook has_many :notes.Рельсы вложенные ресурсы и разработка

Итак, у нот будет два внешних ключа, :user_id и :notebook_id, так как построить/найти заметку?

current_user.notebooks.find (param) .notes.new (params [: item]) создаст foreign_key только для ноутбука или также для пользователя в записи заметок в БД?

Если второй случай (внешний ключ только для ноутбука), как мне писать?

Использование MongoDB с Mongoid и ссылочные отношения

ответ

0

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 
0

Я хотел бы использовать

class User 
    has_many :notebooks 
    has_many :notes, :through => :notebooks 
end 

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

Update

Вы всегда можете установить user_id вручную, как это (я предполагаю, param является идентификатором вашего ноутбука?):

Notebook.find(param).notes.new(params[:item].merge(:user_id => current_user.id)) 
+0

Mongoid (для MongoDB ODM) не поддерживает через –

+0

Ах, извините. Не видел этого немного о Монго. Тогда проигнорируйте. – CambridgeMike

Смежные вопросы