2011-01-19 31 views
0

我想知道是否有可能做這樣的事情如下:Rails:爲需要來自其類的成員的信息的類創建方法?

比方說,我有一個Rails的模式,Foo,與數據庫屬性valueFoo belongs_to BarBar has_many Foos

在我的模型,我想這樣做:

class Foo < ActiveRecord::Base 

    belongs_to :bar 

    def self.average 
    # return the value of all foos here 
    end 

end 

理想我想有這個方法返回匹配的從它被稱爲範圍值,使:

Foo.average # would return the average value of all foos 

@bar = Bar.find(1) 
@bar.foos.average # would return the average of all foos where bar_id == 1 

可以做這樣的事情,如果是這樣,如何?謝謝!

回答

5

只要您確定在average方法的主體中確定調用self而不是Foo的方法,您的工作方式將保持原樣。在調用Foo範圍內的方法時,該方法正文中的self將分配給範圍對象而不是Foo。這裏有一個稍微具體的例子:

# app/models/club.rb 
class Club < ActiveRecord::Base 
    # name:string 
    has_many :people 
end 

# app/models/person.rb 
class Person < ActiveRecord::Base 
    # club_id:integer, name:string, age:integer 
    belongs_to :club 

    def self.average_age 
    # note that sum and count are being called on self, not Person 
    sum('age')/count 
    end 
end 

讓我們看到,當我們創造了一些俱樂部和人發生了什麼:

$ rails console 
Loading development environment (Rails 3.0.3) 
irb(main):001:0> boys_club = Club.create(:name => 'boys') 
irb(main):002:0> girls_club = Club.create(:name => 'girls') 
irb(main):003:0> boys_club.people.create(:name => 'bob', :age => 20) 
irb(main):004:0> boys_club.people.create(:name => 'joe', :age => 22) 
irb(main):005:0> girls_club.people.create(:name => 'betty', :age => 30) 
irb(main):006:0> Person.average_age 
=> 24 
irb(main):007:0> boys_club.people.average_age 
=> 21 
irb(main):008:0> Person.where("name LIKE 'b%'").average_age 
=> 25 
+0

啊哈!我不知道'count',我在想我需要做一些像'self.each do {#stuff}`這顯然不起作用的東西。謝謝,這非常有幫助! – Andrew 2011-01-19 02:14:26

相關問題