2010-03-29 42 views
3

嘿!也许我得到一个子类错误的想法,但我有一个Person模型,它有所谓的“年龄”,所以红宝石子类过滤器

Person.first.age #=> '20' 

现在我想有一个模型,基本上者55岁以上,所以我知道的ATTRIB我能有这样一个类: 类高级<人 结束

但我怎么能“预过滤器”的高级研修班,使每个对象属于这个类有年龄> = 55?

Senior.first.age #=> 56 

UPDATE1: 所以说我有公司的has_many人,和人belongs_to的公司,所以 Company.first.people#=> [ “杰克”, “凯特”]

如果杰克的年龄> 55,将它再工作: Company.first.seniors#=> “杰克”

或者

Company.first.people.senior(S)#=> “杰克”?

我知道named_scope可能是我想要的,但我也注意到named_scope似乎是一个类变量Person上的方法。不是它的实例,这对我来说确实有意义。 - 所以如果我想为一组activerecord模型(同一类的对象)设计一个这样的便利过滤器,我该如何去做呢?我猜我不得不为这样一个数组使用“检测”,但是这会在模型的定义中出现在哪里呢?

更新2 我敢肯定我还没有明确,所以例如 旺旺:第一公司的55岁以上的人 Company.first.people.detect {| P | p.age> 54}

我知道这不是很长,但是我的条件会比> 54更远,而且每次都会发生这种情况。

谢谢!

回答

7

您可以使用命名范围

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

Person.seniors.first.age #=> 83 
+0

我会完全推荐使用这种方法调用它。 – 2010-03-29 10:05:57

+0

我想我忘记了另一个使用,我希望有一个子类高级,它被添加为原始queston的更新。感谢您的快速回复 – 2010-03-29 10:06:20

+0

,因此您可以在Senior fl00r 2010-03-29 10:19:31

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实现出现问题。

0

我不知道如何使用子类来做到这一点,但你可以使用类方法做到这一点,如下所示。

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

,你可以从任何控制器如下

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