2011-01-23 4 views
0

저는 Rails 앱 전체에서 association_collection 메서드 "other_ids"를 아무런 문제없이 사용하고 있습니다. 그러나 연관을 정의하는 모델 내에서 액세스하려고 할 때마다 Rails는 내가 무엇을 차지하고 있는지 전혀 알지 못합니다. 예 :Rails의 모델에서 singular_association_ids에 액세스

class Membership < ActiveRecord::Base 
    belongs_to :course, :touch => true 
    belongs_to :person, :touch => true 
end 

class Day < ActiveRecord::Base 
    belongs_to :course, :touch => true, :counter_cache => true 
    has_many :presents, :dependent => :delete_all 
    has_many :people, :through => :presents 

    before_destroy :clear_attendance 

    def clear_attendance 
     mems = Membership.where(:course_id => course.id, :person_id => person_ids)             
     mems.update_all(["attendance = attendance - ?", (1/course.days.size.to_f)]) 
    end 
end 

이 경우 person_ids는 항상 null입니다. 나는 self.person_ids, people.ids 등을 시도했습니다. 나는 문제가없는 다른 곳에서 day.person_ids를 사용 했으므로 여기서 왜 그것을 사용할 수 없습니까?

저는 Ruby 1.9.1과 Rails 3.0.3을 사용하고 있습니다. 다음은 내 로그에서 SQL 호출입니다.

[1m [36mAREL (0.0ms) [0m [1mUPDATE "멤버쉽"출석율 = 출석률 - 0.3333333333333333 WHERE ("멤버십". "course_id"= 4) AND ("멤버쉽 "." "person_id로 IN (NULL)) [0m

편집 : 질문을 명확히하기 위해 더 많은 코드를 추가

+0

사람들을 얻고 싶습니까? belongs_to a Day? – EnabrenTane

+0

아니요, 그 방법은 단지 예일뿐입니다. 내가 무엇을 찾고 있는지 명확히하기 위해 코드를 업데이트했습니다. – Tyler

답변

0

도움을 주셔서 감사합니다 - 직접 알아 냈습니다. 문제는 콜백의 순서였습니다. 연관이 삭제 된 후 person_ids에 전화를 걸려고했습니다. 이 순서를 변경하면 내 문제가 해결됩니다.

class Day < ActiveRecord::Base 
    before_destroy :clear_attendance 

    belongs_to :course, :touch => true, :counter_cache => true 
    has_many :presents, :dependent => :delete_all 
    has_many :people, :through => :presents 
1

당신이 거기에 정말 원하는 것은 :

def a_method 
    self.people.all 
end 

그러나 귀하의 질문에 대답하기 위해, person_ids입니다 올바른 방법이며 빈 배열을 반환해야합니다 (nil이 아님). 나는 2.3.10 절에서 이와 같은 연관성을 시험해 보았습니다. 어쩌면 코드, 레일 버전 등을 더 게시 할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 생성 된 SQL을 포함하여 요청한대로 업데이트했습니다. – Tyler