0

クラスにTestVisual継承されたGameクラスがあります:

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

ご覧のとおり、マエストラのものです。

だから私はMaestra.first.gamesどちらのリターンを行うことができます[]

しかしMaestra.first.test_visuals、それが戻るので私はできませんundefined method test_visuals

私は特にで作業しているのでTestVisuals、それは理想的には私が引き出したいものですが、それでも親のGameクラスの属性を共有しています。

これはMongoで可能ですか。そうでない場合、または必要でない場合は、MaestraからTestVisualオブジェクトに到達し、それでもGameを継承するためのより良い方法はありますか?

4

1 に答える 1

1

MongoMapperの単一コレクション継承(SCI)は、選択を自動生成します。たとえば、次の場合、同じ結果が生成されます。

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

mongomapper / lib / mongo_mapper / plugins/sci.rbも参照してください-MongoMapper::Plugins :: Sci :: ClassMethods#query

ただし、MongoMapperは、基本クラスの関連付けに基づいてサブクラスの関連付けを自動生成しないため、これは予期されるべきではないと思います。

SCIは、サブクラスと基本クラスを同じMongoDBコレクションに配置することに注意してください。これが希望どおりでない場合は、モジュール性のための他のメカニズムを検討する必要があります。

アソシエーションアクセサメソッドに対して次のメソッドを自分で定義できます。おそらくこれで十分ですか?appendやpushのような他の関連付けメソッドの場合、親メソッドはおそらく実行可能です。

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

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

test / unit / test_visual_test.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

出力

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
于 2012-07-06T15:48:54.800 に答える