假设我有三个class
Person
Person::Single < Person
Person::Married < Person
假设我有两个人是单身=> Person::Single
当我这样做时,我得到两个person:
Person.all.count
=> 2
但是我的目标是只得到类型为Person
而不是Person::Single
或Person::Married
的人
我尝试的是:
Person.where(type: Person.to_s)
=> 2
但这也返回2
,因为Person::Single
和Person::Married
继承自Person
我该怎么做呢?例如,是否有一种方法可以说::Single
和::Married
具有与person
相同的方法,但不是相同的类型?由于
因为这是用rails标记的,所以我假设您的Person类是一个ActiveRecord模型。有一些更多的信息缺失,但我将只是假设我不知道;)
你的Person类继承了ActiveRecord方法,例如"all",而Person::Single(和:: married )将通过Person继承它。
所以,很自然地,当你做一个Person。它只是做常规的<#ActiveRecord>。all方法,它不知道也不关心::Single和::marry。
你可以做的是动态地设置default_scope,基于你调用的类名。all,或。where或其他。
class Person < ActiveRecord::Base
...
def self.default_scope
scope = if self.name == Person.sti_name
where(:type => Person.sti_name)
else
nil
end
scope
end
end
这也将限定where(:whatever => x)查询的范围。
然而,这是假设您有一个名为"type"的属性用于您的Person模型(数据库中的列)。
EDIT:正如Holger指出的,rails STI已经有了魔力。我仍然认为设置一个默认范围是可行的,只是你应该跳过为单身和已婚设置范围。如果您不需要它作为默认作用域,您应该尝试Person.where(:type => Person.sti_name)
或Person.where(:type => Person.name)
,因为如果类继承自ActiveRecord::Base,则rails将类名断言为sti_name。
试试这个:
Person.where(:type => Person).count