2015-04-09 3 views
1

Я как бы новичок в рельсах, и я прочитал и прочитал о has_many_through отношениях, и я до сих пор не понимаю, как это можно манипулировать! Я работаю над приложением, которое имеет три модели: курсы, темы, недели. Курс имеет много тем через недели, и тема может быть во многих курсах также через недели.has_many: через отношение манипуляции

Теперь мой вопрос. Я хотел бы, когда я создаю тему, иметь возможность добавлять несколько полей в течение нескольких недель и создавать также некоторые из атрибутов недели, что является легкой частью. Затем я хочу иметь возможность в форме недель или нового вида выбрать один курс и выбрать несколько тем, которые могут быть на этом курсе. Конечно, темы уже созданы и проходят курсы! Как добавить идентификатор курсов в строки «недели», которые содержат выбранный идентификатор тем?

+1

Добавьте к вашему сообщению – RAJ

ответ

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 

позволяет выбрать один курс и несколько Тема. Но мы не можем сохранить несколько идентификаторов объектов внутри одной записи за неделю. Мы должны создать недельную запись для каждого [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 
+0

Ok, так что ваши отношения пятна на то как они выглядят! и да, я понимаю, что одна из записей таблицы недель не может иметь более одной темы, неделя имеет атрибут: week_number, и мне нужно создать ir через форму темы с меткой «для отображения на номере недели» ?» поэтому форма темы создавала бы все записи из темы плюс эта запись с недели! (я надеюсь, что я сделаю это ясно, если не сообщит) – fr3d0

+0

сейчас я просто хочу, чтобы форма недели или представление служили в качестве кондектора между курсом и темами! что, выбрав один курс и кучу тем, идентификатор курса сохраняется в каждой из недельных записей, содержащих идентификатор выбранной темы! это возможно? и спасибо за ваш ответ! – fr3d0

+0

второй комментарий: да, возможно, я уже сделал это в своем ответе; первый комментарий: я действительно не понимаю ... – MrYoshiji

Смежные вопросы