8

Diciamo che ho un corso in cui gli studenti possono iscriversi tramite un abbonamento (ad esempio un has_and_belongs_to_many relationsip di corsi e studenti). Alcune iscrizioni sono per gli studenti che sono solo osservando la classe (non per il credito, ecc), in modo da:Come posso creare nuovi record con has_many: through e honor: condizioni?

class Course < ActiveRecord::Base 
    has_many :memberships 

    has_many :students, 
      :through => :memberships 

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

Ecco cosa funziona alla grande:

observers = Course.find(37).observers 

Ecco che cosa non funziona:

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

avrei pensato che si poteva costruire nuovi record utilizzando l'associazione e che avrebbe generato:

  1. Un nuovo record per studenti ('Joe Student')
  2. Un nuovo certificato di appartenenza (course_id = 37, student_id = (Joe), osservatore = true)

Ma invece ottengo:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array 

Sono sicuro che sono totalmente confuso su come questo e apprezzerei qualsiasi intuizione! Ho anche provato a farlo con scope nominati sul modello Membership, ma non riesco a ottenere has_many per usare un scope nell'associazione.

Grazie mille per qualsiasi aiuto possibile!

risposta

6

Credo che tu abbia riscontrato un bug di Rails. Ho provato la stessa cosa sulla mia scatola (2.3.4) e mi dà lo stesso errore che non mi sembra affatto corretto. Inoltre ho provato anche il lavoro intorno di:

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

Ma questo crea un abbonamento con il set campo osservatore a falso!

Il brutto soluzione finale mi è venuta è stata la creazione del record Membership manualmente:

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

ho created a ticket for this e sarò indagando ulteriormente dopo la prima colazione.

EDIT: io ho, come promesso, ulteriori indagini e ha trovato se si cambia :conditions hash a una matrice come ad esempio:

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

Funziona come previsto. Ho anche un github repository con codice di esempio e istruzioni da duplicare.

+0

Grazie !! Molto utile! Ahimè, ancora non del tutto al 100%. L'osservatore booleano non è impostato in sql: c.observers.create! (: Name => 'abby') => Studente Crea (2.0 ms) INSERISCI IN "studenti" ("nome", "aggiornamento_at", "created_at") VALUES ('abby', '2009-1 0-04 12:41:35', '2009-10-04 12:41:35') Membership Create (0.0 ms) INSERISCI IN "membership" ("observer", "updated_at", "student_id", "course_id", " created_at") VALUES (NULL, '2009-10-04 12:41:35', 4, 2, '2009-10-04 12:41:35') ** Annotare il valore (NULL) per l'osservatore. – Eric

+0

Domanda stupida: questo problema è ancora presente o le condizioni di hash funzionano correttamente quando si crea un record? (impostazione 'observer: true'). O forse c'è un modo migliore (stiamo parlando di rails4) –

Problemi correlati