2016-02-05 61 views
0

我有模型ProgramCoursesStudent。有program coursestudent course之間MANY_TO_MANY關係......如何只添加記錄中加入臺導軌

所以首先我添加program's courses我要讓program courses學生這樣他就可以參加課程,但問題是,每當我創造學生的課程它當然表格中新增當然也只是我要添加course_idstudent_id連接表,不希望添加課程課程表,因爲課程已經有..

我當然控制器

def create 
    @program = Program.find(params[:program_id]) if params[:program_id] 
    @course = @program.courses.create(program_course_params) if @program 
    @student = Student.find(params[:student_id]) if params[:student_id] 
    if params[:student_id] 
    params[:student].each do |cid| 
     @course = @student.courses.create(name:cid) if @student 
    end 
    end 
end 

形式

<table> 
    <% @student.program.courses.each do |c| %> 
    <tr><td><%=c.name %><td> 
    <td><%= check_box_tag "student[]",c.name,:name %></td> 
    </tr> 
    <% end %> 
    <tr> 
    </table> 

class Course < ActiveRecord::Base 
    has_and_belongs_to_many :students 
    has_and_belongs_to_many :programs 

end 

class Program < ActiveRecord::Base 
    has_and_belongs_to_many :courses 
    has_many :students 
end 

class Student < ActiveRecord::Base 
    has_and_belongs_to_many :courses 

    belongs_to :program 
end 
+0

是什麼PARAMS [:學生]:含有到底是什麼? – Dheeresha

+0

課程名稱 –

+0

編輯我的問題 –

回答

3

試試下面的代碼。

def create 
    @program = Program.find(params[:program_id]) if params[:program_id] 
    @course = @program.courses.create(program_course_params) if @program 
    @student = Student.find(params[:student_id]) if params[:student_id] 
    if params[:student_id] 
    params[:student].each do |cid| 
     course_to_add = Course.find_by_id(cid) 
     @course = @student.courses << course_to_add unless course_to_add.blank? 
    end 
    end 
end 
+0

感謝解決問題 –

+0

還是很低效 –

+0

但查詢過程中是無效的,這將是一個更快的方式安全地確保你沒有創建,如果形式得​​到了壞輸入不存在的課程join_objects? –

2

這一行告訴Rails創建一個全新的課程,那當然聯想到學生

@course = @student.courses.create(name:cid) if @student 

我相信你的意思是鏟當然到像這樣的課程,學生數組:

@student.courses << course 

也許,因爲它出現在students_courses表還包括一個name屬性,而不是簡單地使加入的對象的ID,您可能需要這樣做

StudentsCourse.create(student: @student, course: @course, name: cid) 

有可能在上面的代碼中的一些錯誤,但沒有看到更多的源代碼,這是很難從問題提出的方式來告訴我是否有連接表正確的名稱。這還需要一個連接表的模型,如果你還沒有的話。

+0

這是很多更接近答案,但你沒有加入模型,因爲它的'HABTM' –

+0

不一定。 HABTM在沒有連接表模型的情況下工作,但如果有模型,仍然可以正常工作。 –

+0

你怎麼知道? HABTM表沒有主鍵,我認爲這是Rails模型所必需的? –

2

您當前的代碼是非常低效的,你會得到更好的使用collection_singular_ids方法,如果您只想填充加盟:

#config/routes.rb 
resources :programs do 
    resources :students do 
    match :courses, via: [:get, :put] #-> url.com/programs/:program_id/students/:student_id/courses 
    end 

#app/controllers/students_controller.rb 
class StudentsController < ApplicationController 
    def courses 
    @program = Program.find params[:program_id] 
    @student = Student.find params[:student_id] 
    @courses = Course.all 
    @student.update course_id_params if request.put? 
    end 

    private 

    def course_id_params 
    params.require(:student).permit(course_ids: []) 
    end 
end 

#app/views/students/courses.html.erb 
<%= form_for @student do |f| %> 
    <%= f.collection_check_boxes :course_ids, @courses, :id, :name %> 
    <%= f.submit %> 
<% end %> 
+0

這不會覆蓋每次學生的course_ids嗎?如果這是預期的用途,那很好,但我的印象是舊的課程應該保留下來,並且新的課程應該加入。 –

+1

是的,但因爲它是複選框,所以每次加載'courses'動作時,都會檢查任何現有的'@ student.courses'。覆蓋整個連接數組然後成爲您想要的課程設置 –

+0

好點,您顯然比我更關注。 –