В Rails многие находятся в отношениях принадлежности_к

В моем приложении rails у меня есть следующие модели

class Member < ActiveRecord::Base
  has_many :trainings
end

class Student < ActiveRecord::Base
  belongs_to :member
  has_many :trainings   #maybe a through relationship here
end

class Teacher < ActiveRecord::Base
  belongs_to :member
end

######отредактировано#################

class Training < ActiveRecord::Base
  belongs_to :member  #only member not student nor teacher
end

#############################

Теперь, как я могу построить тренировки в моем студенческом контроллере

class StudentsController < ApplicationController
  def new
    @student = Student.new
    @student.trainings.build    #### This is not working
  end
end

Спасибо


person Tiamon    schedule 07.02.2015    source источник
comment
где твоя Training модель?   -  person Jordan Allan    schedule 07.02.2015
comment
Кроме того, нам бы помогло, если бы вы опубликовали сообщение об ошибке, которое получили.   -  person Jordan Allan    schedule 07.02.2015


Ответы (2)


Вы должны написать accepts_nested_attributes_for в модели и добавить их в сильные параметры, если вы используете рельсы 4. Вот так:

class Student < ActiveRecord::Base
  belongs_to :member
  has_many :trainings     
  accepts_nested_attributes_for :trainings
end

class StudentsController < ApplicationController
  def new
    @student = Student.new
    @student.trainings.build 
  end

  def create
    @student = Student.create(student_params)
    @student.trainings.build(params[:student][:trainings])

    redirect_to student_path
  end

  #For rails 4

  def student_params
     params.require(:student).permit(:id, :name, trainings_attributes: [ :id, :your fields here ])
    end
end

Вот ссылка, которая вам поможет: Rails 4: accepts_nested_attributes_for и массовое назначение

person shobhit shukla    schedule 07.02.2015
comment
Их проблема не имеет ничего общего accepts_nested_attributes_for в данный момент; скорее, они не могут построить экземпляр Training с заданной областью. - person Jordan Allan; 07.02.2015
comment
Спасибо за Ваш ответ. Проблема здесь в том, что я предпочитаю не иметь обоих столбцов (student_id и Teacher_id) при обучении. Вместо этого я предпочитаю только member_id. надеюсь теперь понятно - person Tiamon; 07.02.2015
comment
Кстати, у меня есть accepts_nested_attributes и использование сильных параметров - person Tiamon; 07.02.2015

Если вы правильно определили свои ассоциации, тогда код в вашем действии контроллера new будет работать (я проверял его). Проверьте и убедитесь, что ваша модель Training существует или что вы использовали правильное имя ассоциации (возможно, вы имели в виду :teachers?).

app/models/student.rb

class Student < ActiveRecord::Base
  has_many :trainings
end

app/models/training.rb

class Training < ActiveRecord::Base
  belongs_to :student
end

приложение/контроллеры/students_controller.rb

class StudentsController < ApplicationController
  def new
    @student = Student.new
    @student.trainings.build
  end
end

Обновление:

Предполагая, что именно так определены ваши ассоциации, вы можете создать экземпляр Training с ограниченной областью действия следующим образом:

app/models/member.rb

class Member < ActiveRecord::Base
  has_many :trainings
end

app/models/student.rb

class Student < ActiveRecord::Base
  delegate :trainings, to: :member
  belongs_to :member
end

app/models/training.rb

class Training < ActiveRecord::Base
  belongs_to :member
end

приложение/контроллеры/students_controller.rb

class StudentsController < ApplicationController
  def new
    @student = Student.new
    @student.build_member
    @student.trainings.build
  end
end

Надеюсь, это поможет.

person Jordan Allan    schedule 07.02.2015
comment
Я хочу, чтобы модельное обучение принадлежало модели, а не студенту. Это возможно? - person Tiamon; 07.02.2015
comment
не могли бы вы уточнить? вы хотите от training до belong_to какой модели? - person Jordan Allan; 07.02.2015
comment
Пожалуйста, проверьте это еще раз, я отредактировал его. Я хочу, чтобы он принадлежал участнику - person Tiamon; 07.02.2015
comment
Поскольку trainings существует на member, вам нужно создать экземпляр member с ограниченной областью действия, прежде чем вы сможете построить training. Определение delegate :trainings, to: :member в модели Student позволяет построить экземпляр с ограниченной областью действия от Training до student.trainings.build. - person Jordan Allan; 07.02.2015