【发布时间】:2012-02-10 02:55:08
【问题描述】:
有人可以向我解释一下这里发生了什么吗?
这是我汇总的一个示例,以向大家展示最新情况:
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 返回什么都没有)。
我是否缺少有关其工作原理的信息?我根本不明白这里发生了什么,任何帮助将不胜感激。
【问题讨论】:
标签: ruby sinatra single-table-inheritance ruby-datamapper