2013-07-30 3 views
3

Думаю, я собираюсь задать вопрос из двух частей; если это нужно разделить на 2 вопроса, мои извинения.simple_form с вложенными атрибутами

Во-первых, я стараюсь хранить курсы в course стол (COURSE_NAME, инструктор, start_time, END_TIME и т.д ...), которые имели бы отношение ActiveRecord с course_days (course_id и day что соответствует день из неделя => 1 на воскресенье, 2 на понедельник и т. д.). Моя конечная цель - отобразить их как график в FullCalendar, поэтому я думаю, что лучше всего выделить разделение course и course_days на две таблицы с отношением ActiveRecord. Использование Rails, это хороший способ достичь этого?

Если это так, во-вторых, я использую Simple Form для добавления следующих данных в 2 таблицы: course и course_days. И я думаю, что приближаюсь. Я просто возникли некоторые трудности, добавляющий course_days (например, 3 отдельные строки будут добавлены в course_days если «Понедельник», «Вторник» и «четверг» проверяются

Вот что я работаю с:.

#new.html.erb 
<%= simple_form_for @course, html: { autocomplete: 'off' } do |f| %> 
<%= f.input :title, label: 'Class Name', placeholder: 'Class Name' %> 
<%= f.input :instructor, placeholder: "Instructor Name" %> 
<%= f.input :instructor_email, placeholder: 'Instructor Email' %> 
<%= f.input :building, placeholder: 'Building' %> 
<%= f.input :room, placeholder: 'Room' %> 
<%= f.input :semester do %> 
    <%= f.select :semester_id, @semesters.map { |s| [s.name, s.id] } %> 
<% end %> 
<%= f.simple_fields_for :course_days do |p| %> 
    <%= p.input :day, :as => :boolean %> 
<% end %> 
<%= f.button :submit, :class => 'btn btn-primary' %> 
#app/models/course.rb 
class Course < ActiveRecord::Base 
    has_many :course_days 
    accepts_nested_attributes_for :course_days 
end 

 

#app/models/course_day.rb 
class CourseDay < ActiveRecord::Base 
    belongs_to :course 
end 

 

#app/controllers/courses_controller.rb 

    def new 
    @course = Course.new 
    7.times { @course.course_days.build } #For 7 days of the week?? 
    @semesters = Semester.all() 
    end 

def create 
    @course = Course.new(course_params) 
    if @course.save 
    redirect_to action: 'new' 
    flash[:notice] = "Course Created." 
    else 
    render :new 
    end 
end 

def course_params 
    params.require(:course).permit! 
end 

Любая помощь была бы принята с благодарностью!

EDIT: Вопросы, которые возникают у меня с формой выше: 1) Как я могу сгенерировать 7 флажков с назначенным атрибутом, чтобы определить, есть ли его понедельник, вторник и т. Д.? 2) Используя вложенные атрибуты, он отправляет только одну запись в базу данных, даже если проверено несколько флажков.

Edit 2

Таким образом, по существу, когда эта форма представляется, я хотел бы таблицы базы данных, чтобы выглядеть примерно так:

courses: id => 14, name => Bio 101, start_time => 08:00:00, end_time 09:00:00 

    course_days: id => 11, course_id => 14, day => 1 (For monday) 
    course_days: id => 12, course_id => 14, day => 3 (For wednesday) 
    course_days: id => 13, course_id => 14, day => 5 (For friday) 
+0

кажется a хорошая идея, что именно вас беспокоит? или проблема? – juanpastas

+0

Привет @juanpastas, я обновил свой вопрос. – Dodinas

+0

Вас интересует этот драгоценный камень: https://github.com/ryanb/nested_form? Я думаю, что это может помочь вам достичь того, чего вы хотите. Я бы сделал ... когда пользователь проверяет флажок «день», он нажимает (используя coffeescript) на скрытую кнопку «link_to_add» и предварительно фильтрует один из новых вложенных атрибутов на соответствующее значение дня. Как вы думаете, этот камень может вам помочь? Вы хотите, чтобы я написал подробный ответ? – Kulgar

ответ

2

Пожалуйста, примите во внимание, что с другой таблицей нужно будет извлечь эти строки из БД.

Поэтому, когда вы запрашиваете курс, вам понадобятся максимум 7 ударов, зная дни курса.

Я предлагаю вам иметь days столбец в Модель курса. Этот столбец сохранит выбранные дни в значениях, разделенных запятыми.

Этот способ не нужен accepts_nested_attributes_for. В этом случае вам нужно заполнить столбцы Course.days значениями флажков с помощью обратного вызова before_validation.

+1

Я думаю, что это хорошее начало. Вы также можете использовать жемчужину easy_roles и взять на себя роль дня. В этом случае жемчужина easy_roles использует битовую маску. Проверьте это на github. Вам нужен только один атрибут db и никакой ассоциации. Просто используйте роли в контексте ваших дней. – Mattherick

0

Я не уверен, но что:

7.times { |i| @course.course_days.build day: i } #For 7 days of the week?? 

Таким образом, у вас будет 7 экземпляров с разными значениями дней. Вы можете использовать i+1 начать в 1.

Я полагаю, это будет отправить что-то вроде:

{ 
    "course" => { 
    "course_days_attributes" =>{ 
     "0" => { "day" => "1"}, 
     "1" => { "day" => "5"}, 
    } 
    } 
} 

Попробуйте это только для тестирования, то вы можете реорганизовать:

<%= f.simple_fields_for :course_days do |p| %> 
    <%= p.input :day, :as => :check_box, input_html: { value: f.object.course_days.day } %> 
<% end %> 

Я не знаете, можете ли вы использовать p.object.day вместо f.object.course_days.day. Это должно быть автоматическим, хотя.

Другое дело, я бы попробовал бы это:

<%= f.simple_fields_for :course_days, f.object.course_days do |p| %> 

Но на самом деле я не могу объяснить, что именно происходит.

Я не уверен в этом.

+0

Спасибо, это выглядит немного ближе. Он возвращает этот массив: 'course [days_days_attributes] [0] [day]: 0 course [course_days_attributes] [0] [день]: 1 курс [course_days_attributes] [1] [день]: 0 курс [course_days_attributes] [1] [день]: 1 курс [course_days_attributes] [2] [день]: 0 курс [курс_значения_] [3] [день]: 0 курс [курс_значения_] [4] [день]: 0 курс [ course_days_attributes] [5] [день]: 0 курс [course_days_attributes] [6] [день]: 0' И в БД он отправляет 7 строк, все с правильным 'course_id', но затем столбец' day' это всего лишь 1 или 0. Любые другие идеи по этому поводу? – Dodinas

+0

Я не знаю, что похоже на 'boolean', который у вас там есть. См. Мое обновление. – juanpastas

+0

теперь передаются такие вещи, как «course [course_day_ids] []: 1 course [course_day_ids] []: 3 ', похоже, что он пытается связать с фактическим' course_days' 'id'. Я обновил свой вопрос еще раз, чтобы показать, чего я пытаюсь достичь на стороне БД. – Dodinas

0

Во-первых, simple_form имеет коллекции для входов

Так

<%= f.input :semester do %> 
    <%= f.select :semester_id, @semesters.map { |s| [s.name, s.id] } %> 
<% end %> 

вы можете написать, как

<%= f.input :semester, collection: @semesters %> 

Во-вторых, чтобы получить дни, как булева вы можете сделать что-то вроде этого:

<%= f.simple_fields_for :course_days do |p| %> 
    <%= p.input :day, collection: [['Monday',1],['Tuesday',2][so forth]], as: :check_boxes %> 
<% end %> 
Смежные вопросы