ruby子类过滤器

时间:2010-03-29 09:43:42

标签: ruby-on-rails ruby

喂!也许我得到了一个子类错误的想法,但我有一个Person模型,它有一个名为“age”的attrib所以

Person.first.age #=> '20'

现在我想拥有一个基本上是55岁或以上的人的模特,所以我知道我可以拥有这样的课程: class Senior<人 端

但是我如何“预过滤”高级班级,以便属于该班级的每个对象的年龄> gt = = 55?

Senior.first.age #=> 56

UPDATE1: 所以说我有公司有很多人,有人属于公司,所以 Company.first.people#=> [“杰克”,“凯特”]

如果杰克的年龄是> 55,它会工作吗: Company.first.seniors#=> “插座”

Company.first.people.senior(s)#=> “插座”?

我知道named_scope可能是我想要的,但我也注意到named_scope似乎是Class变量Person的一个方法。不是它的实例,这对我来说是有意义的。 - 因此,如果我要为一组activerecord模型(同一类的对象)设计这样的便利过滤器,我该怎么做呢?我猜我必须对这样的数组使用“检测”,但这会在模型的定义中进行?

更新2 我很确定我不清楚,例如 想要:第一家公司的55岁或以上的人 Company.first.people.detect {| P | p.age> 54}

我知道这不是很长,但我的条件将远远超过> 54每次检测都会变得笨拙。

谢谢!

3 个答案:

答案 0 :(得分:7)

您可以使用命名范围

class Person < ActiveRecord::Base
  named_scope :seniors, :conditions => ['age >= ?', 55]
end

Person.seniors.first.age #=> 83

答案 1 :(得分:3)

这应该可以解决问题。

class Person
  def self.abstract_class?
    true
  end
end

class Junior < Person
  set_table_name "people"
  default_scope :conditions => "people.age < 55"
end

class Senior < Person
  set_table_name "people"
  default_scope :conditions => "people.age >= 55"
end

但我会重新考虑这是否是一个好主意。但是如果您决定使用它,请使用抽象的“Person”类,以避免Rails的STI实现出现问题。

答案 2 :(得分:0)

我不知道如何使用Subclass进行操作,但您可以使用类方法执行此操作。

class Person < ActiveRecord::Base
  def self.senior
    find(:all, :conditions=>["age>=?"], 55)
  end
end

你可以从任何控制器调用它,如下所示

senior_age = Person.senior.first.age unless Person.senior.blank?