有人可以向我解释这里发生了什么吗?
这是我汇总的一个示例,以向大家展示最新情况:
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)
=> []
我会在 Sinatra 上使用它。例如,我希望能够从数据库中以一克的形式抓取我所有的人并将它们保存在其中,@people
但仍然能够对它们进行排序/过滤以在我的视图中用于各种用途。我之前在关联方面做过类似的事情,而且效果很好。但我想尝试 STI,因为它似乎是一种更简洁的方式来处理我的数据。
我也注意到,如果我做某事,@women = Female.all
我得到所有的女人,但如果我做某事,@woman.each do |woman|
我无法访问包含在我的视图中的属性(即woman.favorite_song
不返回任何内容)。
我是否缺少有关其工作原理的信息?我根本不明白这里发生了什么,任何帮助将不胜感激。