2009-09-30 4 views
16

ActiveRecord에는 모델 논리를 단순화하는 데 사용되는 몇 가지 다른 콜백 메소드가 있습니다. 예를 들어, after_findbefore_create 방법.왜 ActiveRecord 콜백은 인스턴스 변수 나 인스턴스 메소드에 접두사 self 키워드가 필요합니까?

하면이 코드 예제 고려 : 나는 인스턴스 변수 나 인스턴스 메소드의 모든 self 접두사를 제거하면 이러한 두 콜백이 호출됩니다

class ExternalPrintingCard < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :ph_user 

    after_create :change_pin 

    def change_pin 
    self.user.randomize_printer_pin 
    end 

    def after_find 
    return if self.card_status == false 
    self.card_status = false if self.is_used_up? 
    self.card_status = false if self.is_expired? 
    self.save! 
    end 
end 

을하지만,이 콜백 내부의 지역 변수가있는 것처럼입니다 행동 양식.

이 인스턴스 변수 (card_status) 인스턴스 메소드 (save!, is_used_up?is_expired?) 및 결합 (user)은 접두어없이 self 이들 2 콜백 방법 밖에 미세했다.

콜백 메소드 (인스턴스 메소드)에 대한 레일스 문서의 샘플 코드는 self 접두어가 없으면 액세스 할 수있는 인스턴스 변수 또는 메소드를 호출하더라도 항상 self 접두사를 사용하는 것처럼 보입니다.

ActiveRecord 콜백을 더 잘 이해하는 사람이이 동작에 대해 도움이되기를 바랍니다.

환호

답변

14

기술적으로 할당 방법 앞에서 자기 만 사용해야합니다. 이것은 후행 = 인스 턴 스 메소드와 국지 변수에 대한 대입을 구별하는 데 필요합니다.

+5

자세한 내용은 Thoughtbot 기사를 참조하십시오. http://robots.thoughtbot.com/post/185504560/to-self-or-not-to-self –

+0

http : //www.rubyfleebie를 설명하는 또 다른 기사입니다. com/use-self-명시 적 / –

1

나스 모른입니다.

ActiveRecord :: Base는 @attributes 인스턴스 변수 (해시) 안에 모든 열 이름을 배치하고 해당 열 이름에 대한 접근 자 인스턴스 메서드를 만듭니다. 예를 들어

:

card_status가 external_printing_cards 테이블의 열은, 그것의 이름 card_status

루비 로컬 변수 정의 동적이므로 card_status= 상기 라인 접근 방식이있을 것이다

def after_find 
    .... 
    card_status = false if self.is_used_up? 
    .... 
end 

은 인스턴스 메서드 대신 로컬 변수 card_status을 정의하고 할당한다는 것을 의미합니다. card_status=

피어 앨런이 게시 한 기사에서 이에 대한 자세한 설명을 제공합니다.