1

我正在尝试调用一个类方法(当前是一个范围),该方法使用其父(或 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类中的范围,以便我可以将其他范围链接在一起。

欣赏任何想法。

4

3 回答 3

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

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

于 2013-09-03T00:04:18.360 回答
0

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

于 2013-09-02T23:35:06.647 回答
0

再搜索一下,我发现这个页面以另一种方式回答了这个问题。这对我来说效果更好,因为它更容易调用,而且我可以在各种关系上使用它。在rails中我如何委托给一个类方法

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])

于 2013-09-03T02:27:44.690 回答