我可以从Rails中的另一个模型调用类方法吗?

时间:2013-09-02 23:16:48

标签: ruby-on-rails

我正在尝试调用一个类方法(当前是一个范围),它使用其父(或belongs_to)模型中的属性,但似乎无法使其正常工作。

我的模特:

class Venue < ActiveRecord::Base
  attr_accessible :address
  has_many :events, :dependent => :destroy
end

class Event < ActiveRecord::Base
  belongs_to :venue
  scope :is_near, lambda {|city| self(Venue.address).near(city, 20, :units => :km)}
end

我知道语法错误,但我认为这说明了我打算做的事情。我想得到场地的地址,并在上面调用另一种方法。我需要Event类中的范围,以便我可以将其他范围链接在一起。

欣赏任何想法。

3 个答案:

答案 0 :(得分:4)

由于#address不是类方法而是实例方法,因此您将无法使用范围执行所需操作。

如果您希望获得场地20公里范围内的所有活动,请在Venue中创建这些课程方法:

class Venue < ActiveRecord::Base
  def self.events_near_city(city)
    venues_near_city(city).map(&:events).flatten
  end

  private

  def self.venues_near_city(city)
    near(city, 20, :units => :km)
  end
end

然后使用Venue.events_near_city(session[:city])来调用它,因为正如您在聊天中告诉我的那样,您正在将该城市存储在会话中。

答案 1 :(得分:0)

正如您在上面定义的那样,address不是类方法 - 它是一个实例方法。您必须有一个场地实例(就像您在视图中所做的那样)来调用它。

答案 2 :(得分:0)

再搜索一下,我发现这个页面以另一种方式回答了问题。这对我来说效果更好,因为它更容易调用,我可以在各种关系中使用它。 In rails how can I delegate to a class method

class Venue < ActiveRecord::Base
  attr_accessible :address

  def self.is_near(city)
    venues_near_city(city).map(&:events).flatten 
  end 
  private 
    def self.venues_near_city(city) 
      self.near(city, 20, :units => :km) 
    end
end

class Event < ActiveRecord::Base
  belongs_to :venue

  class << self
    def is_near(*args, &block)
      Venue.is_near(*args, &block)
    end
  end
end

我用event.is_near(session[:city])

来称呼它