has_many:通过关系操纵

时间:2015-04-09 14:41:51

标签: ruby-on-rails has-many-through

我对rails很新,我已阅读并阅读有关has_many_through关系的内容,但我仍然无法操纵它!我正在开发一个有三个模型的应用程序:课程,主题,周。一个课程有很多主题,几个星期,主题也可以在很多课程中持续数周。

现在我的问题。我想,当我创建一个主题时,能够在几周内添加一些字段,并创建本周的一些属性,这是很容易的部分。然后,我希望能够在几周的表格或新视图中选择一门课程并选择可以在该课程上的几个主题。当然主题已经创建,课程也是如此!如何将课程ID添加到包含所选主题ID的de“周”行!

1 个答案:

答案 0 :(得分:0)

考虑到这些关系:

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

允许我们选择一个课程和几个主题。但是我们无法在单周记录中保存多个主题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
相关问题