【问题标题】:Rails: create a method for a class that needs information from members of its own class?Rails:为需要来自其自身类成员的信息的类创建一个方法?
【发布时间】:2011-01-19 01:36:09
【问题描述】:

我想知道是否可以执行以下操作:

假设我有一个 Rails 模型Foo,它的数据库属性为valueFoo belongs_to Bar, Bar 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

这样的事情可以做到吗,如果可以,怎么做?谢谢!

【问题讨论】:

    标签: ruby-on-rails class ruby-on-rails-3 methods model


    【解决方案1】:

    只要确保在 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
    

    【讨论】:

    • 啊哈!我不知道“计数”,我在想我需要做类似self.each do { #stuff } 的事情,这显然是行不通的。谢谢,很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2020-12-05
    • 1970-01-01
    • 2011-12-17
    • 2020-02-13
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多