3

2 部構成の質問をしようと思います。これを 2 つの質問に分ける必要がある場合は、申し訳ありません。

まず、コースをcourseテーブル (course_name、instructor、start_time、end_time など)に保存しようとしています。このテーブルは、 course_days(course_idとの ActiveRecord 関係を持ちday、日曜日の曜日 => 1、2 に対応します。月曜日など...)。私の最終的な目標は、これらを FullCalendar のスケジュールとして表示することです。そのため、とを ActiveRecord リレーションで 2 つのテーブルに分けるのが最善 courseだと思います。Rails を使用して、これはこれを達成するための良い方法ですか?course_days

もしそうなら、次に、単純なフォームを使用して次のデータを 2 つのテーブルに追加しています:coursecourse_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

どんな助けでも大歓迎です!

編集: 上記のフォームで発生している問題: 1) 属性が割り当てられた 7 つのチェックボックスを生成して、月曜日、火曜日などかどうかを判断するにはどうすればよいですか? 2) ネストされた属性を使用すると、複数のチェックボックスがオンになっている場合でも、1 つのレコードのみがデータベースに送信されます。

編集 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)
4

3 に答える 3

2

別のテーブルがある場合は、DB からその行をフェッチする必要があることを考慮してください。

そのため、コースを依頼した場合、コース日を知るには最大 7 件の追加ヒットが必要になります。

Course モデルにdays作成することをお勧めします。この列には、選択した日がカンマ区切りの値で保存されます。

この方法では必要ありませんaccepts_nested_attributes_for。この場合、コールバックを使用して Course.days 列にチェックボックスの値を入力する必要がありbefore_validationます。

于 2013-08-02T16:57:03.420 に答える
0

よくわかりませんが、どうですか:

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

このようにして、異なる値の日数を持つ 7 つのインスタンスが作成されます。i+11 で開始するために使用できます。

これは次のようなものを送ると思います:

{
  "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| %>

しかし、実際に何が起こっているのかを正確に説明することはできません。

しかし、これについてはよくわかりません。

于 2013-07-31T01:25:43.510 に答える