5

Non riesco a capire come posso configurare un modulo che creerà un nuovo Study durante la creazione del relativo StudySubject e dello Facility. Gli user_id, facility_id e study_subject_id devono essere disponibili per creare l'oggetto Study come si può vedere nel modello di relazione del database.Come creare oggetti nidificati in Rails3 usando accept_nested_attributes_for?

Database model

Ecco la migrazione per il studies. Le altre tabelle non contengono chiavi esterne.

def self.up 
create_table :studies do |t| 
    t.references :user 
    t.references :facility 
    t.references :subject 
    t.date "from" 
    t.date "till" 
    t.timestamps 
end 
add_index :studies, ["user_id", "facility_id", "subject_id"], :unique => true 
end 

I modelli definiscono le seguenti associazioni.

# user.rb 
has_many :studies 

# subject.rb 
has_many :studies 

# facility.rb 
has_many :studies 

# study 
belongs_to :user 
belongs_to :subject 
belongs_to :facility 

Domande

1) sono i has_many e belongs_to definizioni corrette?
2) Come posso creare un study utilizzando accepts_nested_attributes_for?
3) Uno studio deve appartenere a un solo utente. Devo aggiungere lo user_id in ogni altro oggetto per memorizzare l'associazione?

Sono totalmente nuovo a Rails da 2 settimane di apprendimento approfondito. Mi dispiace per una domanda stupida forse.

+0

quale software è stato utilizzato per disegnare lo schema? – gmile

+0

@gmile Ho usato http://www.cacoo.com – JJD

risposta

4

Sì. Funziona. Un buon amico ha offerto il suo aiuto. Questo è ciò che abbiamo creato.
Mi ricordo che nel frattempo ho rinominato StudySubject in Subject.

Il modellostudy.rb

belongs_to :student, :class_name => "User", :foreign_key => "user_id" 
belongs_to :subject 
belongs_to :university, :class_name => "Facility", :foreign_key => "facility_id" 

accepts_nested_attributes_for :subject, :university 

Il controllerstudies_controller.rb

def new 
    @study = Study.new 
    @study.subject = Subject.new 
    @study.university = Facility.new 
end 

def create 
    @study = Study.new(params[:study]) 
    @study.student = current_user 

    if @study.save 
    flash[:notice] = "Successfully created study." 
    redirect_to(:action => 'index') 
    else 
    render('new') 
    end 
end 

Io uso devise per l'autenticazione e cancan per l'autorizzazione. Questo è il motivo per cui current_user è disponibile nel controller.

La nuova vista studionew.html.erb

<%= form_for @study, :url => { :action => "create" } do |f| %> 

    <table summary="Study form fields"> 

    <%= render :partial => "shared/study_form_fields", :locals => { :f => f } %> 

    <%= f.fields_for :subject do |builder| %> 
     <%= render :partial => "shared/subject_form_fields", :locals => { :f => builder } %> 
    <% end %> 

    <%= f.fields_for :university do |builder| %> 
     <%= render :partial => "shared/facility_form_fields", :locals => { :f => builder } %> 
    <% end %> 

    </table> 

    <p><%= f.submit "Submit" %></p> 

<% end %> 

Spero che questo vi farà risparmiare un po 'di tempo. Ho passato molto tempo a capire come devono essere create le cose.