8

Załóżmy, że mam kurs, w którym studenci mogą zapisać się za pośrednictwem członkostwa (np. Ma_i_elongs_to_many relationsip kursów i studentów). Niektóre członkostwa są dla studentów, którzy są po prostu obserwując klasę (nie na kredyt, itp), więc:Jak mogę utworzyć nowe rekordy z has_many: through i honour: conditions?

class Course < ActiveRecord::Base 
    has_many :memberships 

    has_many :students, 
      :through => :memberships 

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

Oto, co działa świetnie:

observers = Course.find(37).observers 

Oto co nie działa:

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

bym pomyślał, że można budować nowe rekordy za pomocą skojarzenia i które byłyby generowane:

  1. Nowy rekord studenta ('Joe Student')
  2. Nowy rekord Członkostwo (course_id = 37, student_id = (Joe), obserwator = true)

Ale zamiast uzyskać:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array 

Jestem pewna, że ​​jestem totalnie zdezorientowana tym, jak to i doceniam wszelkie spostrzeżenia! Próbowałem również zrobić to z nazwanymi zakresami w modelu członkostwa, ale nie mogę uzyskać has_many używać zakresu w asocjacji.

Dziękuję bardzo za każdą możliwą pomoc!

Odpowiedz

6

Uważam, że napotkano błąd Rails. Próbowałem tego samego na moim pudełku (2.3.4) i daje mi ten sam błąd, który w ogóle nie wydaje się właściwy. Dodatkowo Próbowałem też obejść się z:

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

Ale to stwarza członkostwo z zestawu polowego obserwator fałszywego!

Ostateczna brzydki obejście wymyśliłem został ręcznego tworzenia rekordu Membership:

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

created a ticket for this mam i będę dalej śledztwo po śniadaniu.

EDIT: ja, jak obiecał, dalszym badaniom i stwierdzono, jeśli zmienisz :conditions Hash do tablicy, takich jak:

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

to działa zgodnie z przeznaczeniem. Mam również github repository z przykładowym kodem i instrukcjami do duplikowania.

+0

Dzięki! Bardzo pomocne! Niestety, wciąż nie do końca 100%. Boolean obserwatora nie jest ustawiony w sql: c.observers.create! (: Name => 'abby') => Student Create (2.0ms) WSTAW NA "students" ("name", "updated_at", "created_at") VALUES ('abby', '2009-1 0-04 12:41:35', '2009-10-04 12:41:35') Członkostwo Utwórz (0.0ms) INSERT INTO "memberships" ("obserwator", "updated_at", "student_id", "course_id", " created_at") WARTOŚCI (NULL, '2009-10-04 12:41:35', 4, 2, '2009-10-04 12:41:35') ** Zwróć uwagę na wartość (NULL) dla obserwatora. – Eric

+0

Głupie pytanie: czy ten problem nadal występuje, czy warunki hash działają poprawnie podczas tworzenia rekordu? (ustawienie 'obserwatora: prawda'). A może jest lepszy sposób (mówimy o szynach4) –