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