2013-02-11 2 views
0

지오 코더를 사용하고 있고 위치라는 모델이 있습니다. 이 모델에는 경도, 위도 및 주소가 포함되어 있습니다. 내가 원하는 것은 경도와 위도 또는 주소를 입력하는 옵션을 사용자에게 제공하는 것입니다. 그 중 하나가 가득 차면 나머지 정보를 채우십시오. 그래서 여기 내가레일즈 모델에서 두 가지 방식으로 지오 코딩

before_validation :check 
    def check 
    if self.address.blank? 
     reverse() 
    else 
     geo() 
    end 
    end 

    def reverse 
    reverse_geocoded_by :latitude, :longitude, 
    :address => :address 
    after_validation :reverse_geocode 
    end 

    def geo 
    geocoded_by :address 
    after_validation :geocode 
    end 

을했다하지만 난 내가 할 무엇인지 확실하지 않다 다음 undefined method reverse_geocoded_by을 얻고 무엇을!

답변

2

인스턴스 메서드 내에서 클래스 메서드를 호출 할 수 없습니다. 아마도 모델 클래스에 대해 geocoded_by이 정의되어있을 것입니다. 모델의 모든 인스턴스에 영향을 미치지 않고 한 인스턴스의 유효성을 임의로 변경할 수 없으므로 일반적으로 나쁜 아이디어로 간주됩니다.

두 가지 방법 중 하나를 지오 코딩 할 수 있고 각 인코딩 유형에 대한 하위 클래스를 만들 수있는 "위치"모델을 만드는 것이 더 나을 것입니다. 즉, 이들 각각에 대해 규칙을 설정할 수 있습니다. 단일 테이블 상속 (STI)을 사용하면 이러한 저장이 쉽습니다.

그래서 당신은 할 수 : 또한 서브 클래스를 사용하는 것보다 필드를보다 직접적으로 채우기 핸들 방법을 쓸 수

self.location = self.address? ? ReverseLocation.create(...) : ForwardLocation.create(...) 

:

class Location < ActiveRecord::Base 
end 

class ForwardLocation < Location 
    geocoded_by :address 
    after_validation :geocode 
end 

class ReverseLocation < Location 
    reverse_geocoded_by :latitude, :longitude, 
    :address => :address 
    after_validation :reverse_geocode 
end 

그런 다음 그에 따라 적절한 위치를 추가 할 것 이 기능은 전적으로 처리하고있는 데이터의 종류에 달려 있습니다.

일반적으로 클래스에는 전/후 콜백 집합이 하나만 있어야합니다. 콜백 정의가 :if 스타일 선언을 지원하면 조건부로 트리거되는 이러한 콜백 중 일부를 가질 수 있습니다. 때로는 이국적인 요구 사항을 처리하기 위해 자신의 루틴을 작성해야 할 때가 있습니다.

+0

내 유일한 관심사, 미안하지만 난 여전히 루비에 새로운, self.location = .... ReverseLocation.create (...) 어떻게 정의입니까? 내 모델, 내 컨트롤러, 그리고 내 모델에 있다면, 그때 내가 올바른 위치에 유형을 정의해야합니다 – Jseb

+0

그것은 컨트롤러 또는 응용 프로그램 디자인에 따라 모델 수 있습니다. 위치 매개 변수를 별도로 캡처하고 적절한 종류의 위치 객체를 만든 다음 연관된 위치가있는 레코드에 할당하는 것이 좋습니다. – tadman