假设我有三个课程
Person
Person::Single < Person
Person::Married < Person
假设我有两个单身人员=&gt; Person::Single
然后我做两个人:
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
中相同的方法,但它们的类型不同吗?感谢
答案 0 :(得分:0)
由于这是用rails标记标记的,我假设您的Person类是 ActiveRecord 模型。还有一些信息缺失,但我会假设我不知道的地方;)
您的Person类继承 ActiveRecord 方法,例如&#34; all&#34;和 Person :: Single (以及 :: Maried < / strong>)将通过Person继承它。
所以,当然,当你做一个Person.all时,它只会执行常规的 <#ActiveRecord>.all 方法,该方法不知道也不关心:: Single和:: Maried。
你可以做的是动态设置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 =&gt; x)查询范围。
但是,假设您有一个名为&#34; type&#34;为你个人模型(数据库中的列)。
编辑:正如霍尔格指出的那样,rails STI已经存在魔力。我仍然认为设置默认范围是可行的,只有你应该跳过设置单一和已婚的范围。
如果您不需要它作为默认范围,您应该尝试Person.where(:type => Person.sti_name)
或Person.where(:type => Person.name)
,因为如果类继承自ActiveRecord :: Base,则rails会将类名声明为sti_name。
答案 1 :(得分:0)
试试这个:
Person.where(:type => Person).count