has_many :通过关系操作

has_many :through relation manipulation

我是 rails 的新手,我已经阅读并阅读了 has_many_through 关系,但我仍然不知道如何操纵它!我正在开发一个具有三种模型的应用程序:课程、主题、周。一门课程有多个主题,持续数周,而多个课程中的主题也可能持续数周。

现在我的问题。我想,当我创建一个主题时,能够为几周添加一些字段,并创建一些简单的一周属性。然后,我希望能够在周表或新视图中 select 一门课程和 select 该课程中的多个主题。当然,主题和课程都已经创建好了!如何将课程 ID 添加到包含 selected 主题 ID 的 "weeks" 行!

考虑这些关系:

class Week < ActiveRecord::Base
  belongs_to :course
  belongs_to :topic
  validates :course_id, :topic_id, presence: true
end

class Topic < ActiveRecord::Base
  has_many :weeks
  has_many :courses, through: :weeks
end

class Course < ActiveRecord::Base
  has_many :weeks
  has_many :topics, through: :weeks
end

week形式:

= form_for @week do |f|
  # your form
  = f.select :course_id, options_for_select(Course.scoped.map{ |c| [c.name, c.id] })
  = f.select :topics_ids, options_for_select(Topic.scoped.map{ |t| [t.name, t.id] }), multiple: true

允许我们select 一个课程和几个主题。但是我们不能在单个 Week 记录中保存多个主题 ID。我们必须为每个 [course_id, topic_id] 组合创建一个周记录:

weeks_controller

before_filter :sanitize_params, only: [:create, :update]

def create
  params[:week].each do |index, week_attrs|
    Week.create(week_attrs)
  end
  # etc.
end

def update
  params[:week].each do |index, week_attrs|
    Week.find(weeks_attrs.delete(:id)).update_attributes(week_attrs)
  end
  # etc.
end

def sanitize_params
  base_params = params[:week].clone
  params[:week].delete(:topics_ids).each_with_index do |topic_id, i|
    params[:week][i] = base_params.except(:topics_ids).merge(topic_id: topic_id)
  end
end