2013-02-28 2 views
1

레거시 레일즈 앱을 3.0에서 3.2로 업그레이드하고 있으며, ActiveRecord의 어려운 동작을 경험했습니다. 이 모두가 잘 작동, 내 레일 3.0 분기에Rails 3.2 - 왜 []를 오버 라이딩하면 has_many 관계가 혼란 스럽습니까?

class Newsletter < ActiveRecord::Base 
    has_many :newsletter_entries 

    def [](key) 
    # Weird old code, not related to NewsletterEntry 
    end 

    # etc. 
end 

class NewsletterEntry < ActiveRecord::Base 
    belongs_to :newsletter 

    # etc. 
end 

: 저는 두 매우 간단한 모델을 가지고있다. 그러나 내 Rails 3.2 브랜치에서는 어떤 이유로 든 newsletter_entries를 뉴스 레터로 호출하면 항상 비어있게됩니다. SQL 문을 살펴보면 ActiveRecord가 newsletter_entries 테이블에서 newsletter_id = NULL을 가진 항목을 검색한다는 것을 알았습니다. 처리중인 뉴스 레터의 실제 기본 키에 관계없이. 이 콘솔 출력의 끝에서 SQL을 고려 : 나는 다시 뉴스 모델에 대한 사용자 정의 [] 방법으로 문제를 추적 울며이를 갊이 있으리라의 많은 후

> newsletter = Newsletter.create! :title => "Proof of Concept" 
### SQL and irrelevant fields omitted 
=> #<Newsletter id: 13, title: "Proof of Concept", created_at: "2013-02-28 00:44:25", updated_at: "2013-02-28 00:44:25"> 

> newsletter.newsletter_entries 
    NewsletterEntry Load (0.4ms) SELECT `newsletter_entries`.* FROM `newsletter_entries` WHERE `newsletter_entries`.`newsletter_id` IS NULL 
=> [] 

-를 제거하고 모든 것을 정상으로 돌아 . 이 오버라이드는 처음에는 코드 냄새 였고, 소스를 알았으므로 문제를 쉽게 해결할 수 있습니다.하지만 전체 사건으로 인해 ActiveRecord 관계에서 []의 역할에 대해 궁금증이 생겼습니다. 아무도 나에게 정확하게 여기에 잘못 된 것을 설명 할 수 있습니까?

답변

1

Newsletter 클래스는 ActiveRecord::Base에서 상속되며 activerecord/lib/active_record/base.rb으로 정의됩니다.

class Base 안에 포함 된 모듈 중 하나는 AttributeMethods이며, 이는 activerecord/lib/active_record/attribute_methods.rb으로 정의됩니다.

그리고 정의 방법이있다 :

코드가 레일 코드를 나누기 곳이다
# activerecord/lib/active_record/attribute_methods.rb 
def [](attr_name) 
    read_attribute(attr_name) { |n| missing_attribute(n, caller) } 
end 

.

방법이를 찾을 수 있습니다 :

  • 복제 레일 저장소를. (class base에 포함 grep -r 'class Base' ./activerecord/
  • 열고이 클래스를 실행하고 모듈과 모든 def [] 검색 결과를 비교 자체가 activerecord/lib/active_record/base.rb 파일의 하단 근처에 정의 된 클래스
+0

: grep -r 'def \[\]' ./activerecord/

  • class Base 찾기 실행 :
  • 모든 def [] 찾을 수 있습니다. 그것은 무엇이 오버라이드되고 있는지 명확히 설명합니다.하지만 레일스 3보다 앞선 동작이있는 것처럼 보입니다. 내가 정말로 궁금한 점은 has_many로 정의 된 관계가 갑자기 3.1 또는 3.2에서 Rails-default [] 메소드에 의존하는 이유라고 생각합니다. 그 이 상황에서 실패는 훨씬 더 의미가 있습니다. 많은 감사합니다. – Andrew

  • +0

    다음 명령으로 분기 간 변경 사항을 탐색 할 수 있습니다 :'git diff -b origin/3-0-stable origin/3-2-stable./activerecord/lib/active_record/attribute_methods.rb' –