2010-03-29 69 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?