ここで何が起こっているのか誰か説明してくれませんか?
これは、どうしたのかを示すためにまとめた例です。
class Person
include DataMapper::Resource
property :id, Serial
property :type, Discriminator
property :name, String
property :age, Integer
end
class Male < Person
end
class Father < Male
property :job, String
end
class Son < Male
end
class Female < Person
end
class Mother < Female
property :favorite_song, String
end
class Daughter < Female
end
DataMapper.auto_upgrade!
電話すると、次のようPerson.all
になります。
Person.all
=> [#<Son @id=1 @type=Son @name="Mike" @age=23 @status=nil>,
#<Son @id=2 @type=Son @name="Carlos" @age=12 @status=nil>,
#<Father @id=3 @type=Father @name="Robert" @age=55 @job=<not loaded>>,
#<Mother @id=4 @type=Mother @name="Wanda" @age=47 @status=nil @favorite_song=<not loaded>>,
#<Daughter @id=5 @type=Daughter @name="Meg" @age=16 @status=nil>]
そして、私が呼び出すと、次のようPerson.get(3).type
になります:
Person.get(3).type
=> Father
そしてMale.all
私にこれを与えます:
Male.all
=> [#<Son @id=1 @type=Son @name="Mike" @age=23 @status=nil>,
#<Son @id=2 @type=Son @name="Carlos" @age=12 @status=nil>,
#<Father @id=3 @type=Father @name="Robert" @age=55 @job=<not loaded>>]
そしてMale.get(3).type
これを与える:
Male.get(3).type
=> Father
しかしPerson.all(:type => Male)
、空の配列を返します: (?)
Person.all(:type => Male)
=> []
ただし、すべてのタイプ エントリ (=/)Person.all(:type => Son)
を返します。Son
Person.all(:type => Son)
=> [#<Son @id=1 @type=Son @name="Mike" @age=23 @status=nil>,
#<Son @id=2 @type=Son @name="Carlos" @age=12 @status=nil>]
@person = People.all
@person のすべてのエントリを期待どおりに取得するようなことをしようとすると、. @men = @person.all(:type => Male)
しかし、空の配列を取得するようなことはできません。
@men = @people.all( :type => Male)
=> []
私はこれをシナトラと一緒に使用します。私が望むのは、たとえば、DB からすべての人を 1 グラムで取得して保持@people
できるようにすることですが、ビューでさまざまな用途に合わせて並べ替え/フィルター処理できるようにすることです。以前に関連付けで同様のことを行ったことがありますが、かなりうまくいきました。しかし、自分のデータを処理するより簡潔な方法と思われる STI を試してみたいと思います。
@women = Female.all
私は、私がすべての女性を取得するような@woman.each do |woman|
ことをすると、ビューに含まれるプロパティにアクセスできない (つまり、woman.favorite_song
何も返さない)ことにも気付きました。
これがどのように機能するかについて何か不足していますか?ここで何が起こっているのかまったくわかりません。助けていただければ幸いです。