8

학생이 회원으로 등록 할 수있는 코스가 있다고 가정 해 봅시다 (예 : 수업과 학생의 has_and_belongs_to_many 관계). 일부 회원은 그래서 단지 (안 등 신용) 클래스를 관찰하는 학생들을위한 것입니다 :has_many : through 및 honor : 조건을 사용하여 새 레코드를 만들려면 어떻게해야합니까?

class Course < ActiveRecord::Base 
    has_many :memberships 

    has_many :students, 
      :through => :memberships 

    has_many :observers, 
      :through => :memberships, 
      :source => :student, 
      :conditions => { :memberships => { :observer => true }} 
end 

여기 좋은 작품 내용은 다음과 같습니다

observers = Course.find(37).observers 

여기에 작동하지 않는 내용은 다음과 같습니다

new_observer = Course.find(37).observers.build(:name => 'Joe Student') 

내가 하나가 연결을 사용하여 새 레코드를 만들 수 있다고 생각했을 것이다 그리고 그 생성 한 것 :

  1. (참 Course_ID에 = 37, student_id = (조), 관찰자 ​​=) 새로운 학생 레코드 ('조 학생')
  2. 새로운 회원 기록

하지만 그 대신 내가 얻을 :

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array 

나는 이것이 어떻게 통찰력을 얻는가에 대해 완전히 혼란 스러울 것이라고 확신한다! 또한 Membership 모델에서 명명 된 범위로이 작업을 시도했지만 has_many를 사용하여 연결에서 범위를 사용할 수없는 것처럼 보입니다.

가능한 모든 도움에 감사드립니다.

답변

6

나는 레일 버그를 발견했습니다. 나는 상자 (2.3.4)에서 똑같은 것을 시도했고 나에게 똑같은 오류가 나타나지 않았다.

course = Course.first 
course.observers << Student.create(:name => "Joe Student") 
course.save 

을하지만이 거짓에 관찰자 필드 세트 회원을 만듭니다 또한 나는 또한의 주위에 작업을 시도!

내가 수동으로 Membership 기록을 작성했다 내놓았다 마지막 추한 해결 방법 :

Membership.create!(:course => Course.first, :student => Student.first, :observer => true) 

나는 created a ticket for this했습니다 나는 아침 식사 후 더 조사 할 것입니다.

편집 : 나는 약속대로 추가 조사와 같은 배열에 :conditions 해시를 변경할 경우 발견 : 의도 한대로 작동

:conditions => ["memberships.observer = ?", true] 

. 나 또한 github repository 예제 코드와 복제 지침이 있습니다.

+0

감사합니다. 매우 도움이된다! 아아, 아직 100 %가 아닙니다. == 'abby') => 학생 작성 (2.0ms) INSERT INTO "students"("name", "updated_at", "created_at") VALUES ('abby', '2009-1-0-04 12:41:35', '2009-10-04 12:41:35') 회원 가입 (0.(NULL, '2009-10-04 12:41:35', 4, 2, 0) INSERT INTO "멤버쉽"("옵저버", "updated_at", "student_id", "course_id", " created_at") VALUES '2009-10-04 12:41:35') ** 옵저버에 대한 값 (NULL)에 유의하십시오. – Eric

+0

바보 같은 질문 : 레코드를 만들 때이 문제가 계속 발생하거나 해시 조건이 제대로 작동합니까? ('observer : true'를 설정하십시오). 아니면 더 좋은 방법이있을 수 있습니다 (레일 4에 대해 이야기하고 있습니다) –

관련 문제