5

No puedo entender cómo puedo configurar un formulario que creará un nuevo Study mientras también crea el StudySubject relacionado y el Facility. El user_id, facility_id y study_subject_id tienen que estar disponibles para crear el objeto Study como se puede ver en el modelo de relación de base de datos.Cómo crear objetos anidados en Rails3 usando accepts_nested_attributes_for?

Database model

Aquí es la migración de la studies. Las otras tablas no contienen claves foráneas.

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 

Los modelos definen las siguientes asociaciones.

# 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 

Preguntas

1) ¿Son correctos los has_many y belongs_to definiciones?
2) ¿Cómo puedo crear un study usando accepts_nested_attributes_for?
3) Un estudio solo debe pertenecer a un usuario. ¿Debo agregar el user_id en cualquier otro objeto para almacenar la asociación?

Soy totalmente nuevo en Rails desde 2 semanas de aprendizaje extensivo. Perdón por una pregunta estúpida tal vez.

+0

¿Qué software se usó para dibujar el diagrama? – gmile

+0

@gmile Utilicé http://www.cacoo.com – JJD

Respuesta

4

Sí. Funciona. Un buen amigo le ofreció su ayuda. Esto es lo que configuramos.
Tenga en cuenta que cambié el nombre de StudySubject a Subject mientras tanto.

El modelostudy.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 

El controladorstudies_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 

utilizo devise para la autenticación y cancan para la autorización. Es por eso que current_user está disponible en el controlador.

La nueva vista estudionew.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 %> 

espero que esto le ahorrará algo de tiempo. Pasé mucho tiempo para darme cuenta de cómo deben organizarse las cosas.

Cuestiones relacionadas