Rieles de recursos anidados y dispositivo

Digamos que tengo un modelo de dispositivo llamado "Usuario" que tiene muchos :notes y :notebooks y cada :notebook tiene muchas :notes.

Entonces, una nota tendrá dos claves externas, :user_id y :notebook_id, entonces, ¿cómo construir/encontrar una nota?

current_user.notebooks.find(param).notes.new(params[:item]) creará la clave externa solo para el cuaderno o también para el usuario en el registro de notas en la base de datos.

Si es el segundo caso (clave externa solo para notebook), ¿cómo debo escribir?

Usando MongoDB con MongoID y relaciones referenciadas

preguntado el 03 de mayo de 12 a las 17:05

2 Respuestas

Mongoid administrará las referencias y consultas de documentos por usted, solo asegúrese de especificar la asociación/relación para cada dirección que necesite (p. ej., el usuario tiene_muchas: notas Y la nota pertenece_a: usuario). Al igual que ActiveRecord, parece ser "inteligente" en cuanto a las relaciones. Por favor, no manipule las referencias manualmente, sino que deje que su ODM (Mongoid) trabaje para usted. A medida que ejecuta sus pruebas (o usa la consola de Rails), puede seguir -f log/test.log (o log/development.log) para ver qué operaciones de MongoDB está realizando Mongoid para usted y puede ver el objeto real referencias a medida que se actualizan los documentos. Puede ver cómo una relación hace uso de una referencia de objeto en particular, y si presta atención a esto, la optimización del enlace debería volverse más clara.

Los siguientes modelos y pruebas me funcionan. Los detalles sobre la configuración están disponibles bajo petición. Espero que esto ayude.

Modelos

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

Pruebatest

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

Resultado

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

contestado el 05 de mayo de 12 a las 09:05

yo usaría

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

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

Noticias

Siempre puede configurar el ID de usuario manualmente, así (¿supongo que param es el ID de su computadora portátil?):

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

contestado el 03 de mayo de 12 a las 17:05

mongoid (odm para mongodb) no es compatible con - mateo pagliazzi

Oh, lo siento. No vi eso sobre Mongo. Por favor ignora entonces. - CambridgeMike

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.