¿La forma más adecuada de usar clases heredadas con relaciones compartidas?

Tengo TestVisual clase que es heredada por el Game clase :

class TestVisual < Game
  include MongoMapper::Document  
end

class Game
  include MongoMapper::Document         

  belongs_to :maestra  

  key :incorrect,         Integer
  key :correct,           Integer
  key :time_to_complete,  Integer

  key :maestra_id, ObjectId

  timestamps!

end

Como pueden ver pertenece a Maestra.

Entonces puedo hacer Maestra.first.games que regresa []

pero no puedo Maestra.first.test_visuals porque vuelve undefined method test_visuals

Ya que estoy trabajando específicamente con TestVisuals, eso es idealmente lo que me gustaría extraer, pero aún así compartir los atributos de su clase Game principal.

¿Es esto posible con Mongo? Si no lo es o si no es necesario, ¿hay alguna otra manera mejor de llegar al objeto TestVisual de Maestra y aún así heredar Game?

preguntado el 30 de junio de 12 a las 22:06

1 Respuestas

La herencia de colección única (SCI) en MongoMapper genera automáticamente la selección, por ejemplo, lo siguiente produce los mismos resultados.

p Game.where(_type: 'TestVisual').all
p TestVisual.all

Véase también mongomapper/lib/mongo_mapper/plugins/sci.rb - MongoMapper::Plugins::Sci::ClassMethods#query

Sin embargo, MongoMapper no genera automáticamente asociaciones para subclases basadas en las asociaciones de la clase base, y no creo que esto deba esperarse.

Tenga en cuenta que SCI coloca subclases y clases base en la misma colección de MongoDB. Si esto no es lo que desea, debe considerar otros mecanismos de modularidad.

Puede definir el siguiente método usted mismo para un método de acceso a la asociación, ¿quizás esto sea suficiente para sus propósitos? Para otros métodos de asociación como agregar o empujar, los métodos principales probablemente funcionen.

class Maestra
  include MongoMapper::Document
  key :name, String
  many :games

  def test_visuals
    games.where(_type: 'TestVisual')
  end
end

prueba/unidad/prueba_visual_prueba.rb

require 'test_helper'

def ppp(obj)
  puts obj.inspect.gsub(/, ([^#])/, ",\n\t\\1").gsub(/, #/, ",\n #")
end
class TestVisualTest < ActiveSupport::TestCase
  def setup
    Maestra.delete_all
    Game.delete_all
  end

  test "inheritance" do
    maestra = Maestra.create(name: 'Fiona')
    maestra.games << Game.create(incorrect: 1, correct: 9, time_to_complete: 60)
    maestra.games << TestVisual.create(incorrect: 2, correct: 8, time_to_complete: 61)
    ppp maestra.games.to_a
    ppp maestra.test_visuals.to_a
  end
end

salida

Run options: --name=test_inheritance

# Running tests:

[#<Game _id: BSON::ObjectId('4ff7029a7f11ba6e43000002'),
    _type: "Game",
    correct: 9,
    created_at: Fri,
    06 Jul 2012 15:22:02 UTC +00:00,
    incorrect: 1,
    maestra_id: BSON::ObjectId('4ff7029a7f11ba6e43000001'),
    time_to_complete: 60,
    updated_at: Fri,
    06 Jul 2012 15:22:02 UTC +00:00>,
 #<TestVisual _id: BSON::ObjectId('4ff7029a7f11ba6e43000003'),
    _type: "TestVisual",
    correct: 8,
    created_at: Fri,
    06 Jul 2012 15:22:02 UTC +00:00,
    incorrect: 2,
    maestra_id: BSON::ObjectId('4ff7029a7f11ba6e43000001'),
    time_to_complete: 61,
    updated_at: Fri,
    06 Jul 2012 15:22:02 UTC +00:00>]
[#<TestVisual _id: BSON::ObjectId('4ff7029a7f11ba6e43000003'),
    _type: "TestVisual",
    correct: 8,
    created_at: Fri,
    06 Jul 2012 15:22:02 UTC +00:00,
    incorrect: 2,
    maestra_id: BSON::ObjectId('4ff7029a7f11ba6e43000001'),
    time_to_complete: 61,
    updated_at: Fri,
    06 Jul 2012 15:22:02 UTC +00:00>]
.

Finished tests in 0.026661s, 37.5080 tests/s, 0.0000 assertions/s.

1 tests, 0 assertions, 0 failures, 0 errors, 0 skips

Respondido 06 Jul 12, 16:07

¡Wow increible! Muchas gracias Gary Murakami. ¡Superashi! - Viaje

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