2013-09-02 2 views
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 클래스의 범위가 필요합니다.

아이디어가 있으면 감사하겠습니다.

+1

event.is_near(session[:city])로 전화'#의 address'는'Venue'에서 클래스 메소드하지만 인스턴스 방법은 아니다? – depa

+0

': address'는 데이터베이스의 문자열입니다. 내보기에서'<% = event.venue.address %> '를 사용하여 액세스 할 수 있습니다. – BHOLT

+0

'# near' 메소드의 정의를 게시 할 수 있습니까? – depa

답변

4

#address은 클래스 메소드가 아니라 인스턴스 메소드이므로 범위를 사용하여 원하는 것을 수행 할 수 없습니다.

당신은 개최지의 20km 범위 내에서 모든 이벤트를 얻는 대신 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])를 사용하여 전화, 세션에 도시를 저장하고 있습니다.

0

위에서 정의한대로 address은 클래스 메소드가 아닙니다. 이는 인스턴스 메소드입니다. 당신은 (당신이보기에하는 것처럼) 장소의 인스턴스를 호출해야합니다.

+0

': address '가' 'self.near ... '를 사용하여'event' 클래스를 만들었지 만 사용자 모임에 더 의미가 있기 때문에'venue'를 자체 클래스로 분리했습니다. 범위는'event'의 인스턴스에서 호출되기 때문에'venue.address'에 대한 정보를 포함하고 있기 때문에 어떻게 든 정보를 얻을 수 있습니까? 어쩌면 관계를': inverse of'로 바꾸는 것일까 요? – BHOLT

+0

문제는 여러 가지 이벤트를 찾고 있다는 것입니다. 각각의 이벤트는 자체 장소가 있습니다. 나는 네가하려는 일을 볼 수있다 ... 네가 어떻게해야 하는지를 알아낼 수 있는지 확신 할 수 없다. (죄송하다.) 나는 내가 할 수있는 모든 것이 바로 지금 당신을 위해 일하지 않는 이유를 지적하고있다. –

+0

tl : dr : no - 인스턴스가 끝났기 때문에 원하는대로 할 수는 없지만 인스턴스가 없으면 클래스가 있습니다. "가까운"것이 구현 된 방법을 보여줄 수 있습니까? –

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 

그리고 내가 생각

+0

이 경우 귀하를 대신하여 위임하지 않겠습니까? – depa

+0

"대리자 도우미가 현재 클래스의 인스턴스 메서드를 정의하므로 해당 인스턴스가 해당 인스턴스의 일부 변수에 대한 호출을 위임합니다"때문에 대리인을 가져올 수 없습니다. 이 질문은 더 나은 설명 : http://stackoverflow.com/questions/14568211/in-rails-how-can-i-delegate-to-a-class-method – BHOLT

+0

네,하지만 그 질문은 클래스에서 위임하는 방법에 대해 설명합니다. 수평. – depa

관련 문제