喂!也许我得到了一个子类错误的想法,但我有一个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每次检测都会变得笨拙。
谢谢!
答案 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?