我对rails很新,我已阅读并阅读有关has_many_through关系的内容,但我仍然无法操纵它!我正在开发一个有三个模型的应用程序:课程,主题,周。一个课程有很多主题,几个星期,主题也可以在很多课程中持续数周。
现在我的问题。我想,当我创建一个主题时,能够在几周内添加一些字段,并创建本周的一些属性,这是很容易的部分。然后,我希望能够在几周的表格或新视图中选择一门课程并选择可以在该课程上的几个主题。当然主题已经创建,课程也是如此!如何将课程ID添加到包含所选主题ID的de“周”行!
答案 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