人在哪里而不是人::单身

时间:2015-05-15 11:29:19

标签: ruby ruby-on-rails-3 ruby-on-rails-4

假设我有三个课程

Person

Person::Single < Person

Person::Married < Person

假设我有两个单身人员=&gt; Person::Single

然后我做两个人:

Person.all.count
=> 2

但我的目标是只让那些Person而不是Person::SinglePerson::Married

的人

我尝试的是:

Person.where(type: Person.to_s)
=> 2

但这也会返回2,因为Person::SinglePerson::Married继承自Person

我该怎么做? 例如,有一种方法可以说::Single::Married具有person中相同的方法,但它们的类型不同吗?感谢

2 个答案:

答案 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