8

Angenommen, ich habe einen Kurs, in dem sich Studierende über eine Mitgliedschaft anmelden können (z. B. eine has_and_belongs_to_many-Beziehung zu Kursen und Kursteilnehmern). Einige Mitgliedschaften sind für Studenten, die gerade die Klasse zu beobachten (nicht für Kredit, etc.), so:Wie kann ich neue Datensätze mit has_many: through und honor: conditions erstellen?

class Course < ActiveRecord::Base 
    has_many :memberships 

    has_many :students, 
      :through => :memberships 

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

Hier ist, was funktioniert gut:

observers = Course.find(37).observers 

Hier ist, was nicht funktioniert:

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

ich hätte gedacht, dass man neue Datensätze aufbauen könnte die Assoziation mit und erzeugt hätte:

  1. ein neuer Student Satz ('Joe Student)
  2. Eine neue Mitgliedschaft Rekord (course_id = 37, STUDENT_ID = (joe), Beobachter = true)

Aber stattdessen erhalte ich:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array 

Ich bin mir sicher, ich bin völlig verwirrt darüber, wie dies und würde jede Einsicht zu schätzen wissen! Ich habe auch versucht, dies mit benannten Bereichen im Membership-Modell zu tun, aber ich kann nicht scheinen, has_many zu bekommen, um einen Bereich in der Assoziation zu benutzen.

Vielen Dank für jede mögliche Hilfe!

Antwort

6

Ich glaube, dass Sie einen Rails-Fehler festgestellt haben. Ich habe das gleiche auf meiner Box (2.3.4) versucht und es gibt mir den gleichen Fehler, der überhaupt nicht richtig erscheint. Außerdem habe ich versucht, auch die Arbeit herum:

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

Aber das schafft eine Mitgliedschaft mit dem Beobachter-Feld auf falsch!

Die letzte hässliche Abhilfe kam ich mit war die Schaffung der Membership Aufzeichnung manuell:

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

Ich habe created a ticket for this und ich werde weiter nach dem Frühstück werden untersucht.

EDIT: Ich habe, wie versprochen, weiter untersucht und, wenn Sie Ihre :conditions Hash in ein Array wie ändern gefunden:

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

Es funktioniert wie vorgesehen. Ich habe auch eine github repository mit Beispielcode und Anweisungen zu duplizieren.

+0

Danke !! Sehr hilfreich! Leider immer noch nicht ganz 100%. Der Beobachter boolean wird nicht in sql gesetzt: c.observers.create! (: Name => 'abby') => Student Erstellen (2.0ms) INSERT INTO "Studenten" ("name", "updated_at", "created_at") VALUES ('abby', '2009-1 0-04 12:41:35', '2009-10-04 12:41:35') Mitgliedschaft erstellen (0.0 ms) INSERT INTO "Mitgliedschaften" ("Beobachter", "aktualisiert_at", "Schüler_ID", "Kurs_ID", " created_at") WERTE (NULL, '2009-10-04 12:41:35', 4, 2, '2009-10-04 12:41:35') ** Notieren Sie den Wert (NULL) für den Beobachter. – Eric

+0

Dumm Frage: ist dieses Problem noch vorhanden oder Hash-Bedingungen funktionieren gut beim Erstellen eines Datensatzes? (Einstellung "Beobachter: wahr"). Oder vielleicht gibt es einen besseren Weg (wir sprechen über Rails4) –

Verwandte Themen