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
我是 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