레거시 레일즈 앱을 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 관계에서 []의 역할에 대해 궁금증이 생겼습니다. 아무도 나에게 정확하게 여기에 잘못 된 것을 설명 할 수 있습니까?
:
grep -r 'def \[\]' ./activerecord/
class Base
찾기 실행 :def []
찾을 수 있습니다. 그것은 무엇이 오버라이드되고 있는지 명확히 설명합니다.하지만 레일스 3보다 앞선 동작이있는 것처럼 보입니다. 내가 정말로 궁금한 점은 has_many로 정의 된 관계가 갑자기 3.1 또는 3.2에서 Rails-default [] 메소드에 의존하는 이유라고 생각합니다. 그 이 상황에서 실패는 훨씬 더 의미가 있습니다. 많은 감사합니다. – Andrew다음 명령으로 분기 간 변경 사항을 탐색 할 수 있습니다 :'git diff -b origin/3-0-stable origin/3-2-stable./activerecord/lib/active_record/attribute_methods.rb' –