RailsActive Record和嵌套资源

时间:2014-02-20 21:57:56

标签: ruby-on-rails activerecord

我希望对按钮执行单击操作,以便为连接表添加资源。有几种方法可以在控制台中执行此操作,但我无法在生活中找出如何在控制台外实现此功能。

这是一个模仿我当前模型的例子:

class Student < ActiveRecord::Base
  has_many :reports
  has_many :schools, through: :reports
end

class School < ActiveRecord::Base
  has_many :reports
  has_many :students, through: :reports

  accepts_nested_attributes_for :reports
end

class Report < ActiveRecord::Base
  belongs_to :student
  belongs_to :school

  accepts_nested_attributes_for :student
  accepts_nested_attributes_for :school

  validates :student_id, presence: true
  validates :school_id, presence: true
end

此方法返回属于学生的所有成绩单(学生已存在) 我的数据库):

@student.reports 

此方法返回学生参加的所有学校:

@student.schools

我可以通过以下方式将现有学校添加/关联到学生:

@school = School.find(params[:id])
if student.present?
@student = Student.find(params[:id])
@student.schools << @school 

请注意,单个报告与许多学生的关联是有意的。我现在的问题是如何让学生只需点击特定学校就可以将学校添加到他们的报告中?我的报告表(基本上是一个连接表)应该在click_action发生/发生时自动更新(这是一个将特定student_id与特定学校ID相关联的新行)。

一直试图解决这个问题,但由于某些原因没有取得进展。提前谢谢!

1 个答案:

答案 0 :(得分:1)

嗯,首先,在您看来,您应该为每所学校举办javascript / DOM活动:

onclick(window.location.href = "<%= path_to_add_school_to_students(student,school) %>")

所以你只需点击一下。

在您的控制器中

student=Student.find(params[:student])
if student.schools.find(params[:school]).nil? # if school not already assigned
    student.reports.create(:school_id => params[:school])
end