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:
- Un nuovo record per studenti ('Joe Student')
- 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!
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
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) –