2017-09-21 6 views
0

私は、学生が試験の不在を登録できるようにするRailsアプリケーションを開発中です。study_programをRailsアプリケーションにモデル化する方法

あなたが見ることができるように、これらはモデル

class User < ApplicationRecord 
    has_many :absences 
    has_many :courses, through: :absences 
end 

class Absence < ApplicationRecord 
    belongs_to :user 
    belongs_to :course 
end 

class Course < ApplicationRecord 
    has_many :absences 
    has_many :users, through: :absences 
end 

あり、私はFOREIGN_KEYを保持しているjoin_table欠席を使用していますユーザーとコースへ

登録フォームは次のようになります。

<%= form_for [current_user, @absence] do |f| %> 
    <%= f.label :course_id, "Vak" %> 
    <%= f.select :course_id, options_for_courses, label: "Vak" %> 
    <%= f.label :date, "Datum" %> 
    <%= f.text_field :date %> 
    <%= f.submit "Afwezigheid aanvragen" %> 
<% end %> 

私は学生がstudy_programを登録用紙にも入力できるようにするべきです。しかし、これを実装する最良の方法は何か分かりません。 Absencesテーブルにフィールド( 'study_program')を追加するか、study_programを独自のモデル(StudyProgramクラス)にモデル化する必要があります。

登録フォームの選択ボックスから彼のstudy_programを選択するための不在の登録時には、最終的に学生は歓迎します。あなたの助けのための

おかげで、

アンソニー

答えて

2

は、ここでは一般的なルールは次のとおりです。研究プログラムは、独自の情報を保存しようとしていますか?利用可能な学習プログラムのリストが変わることはありますか?

study_programは列挙型としてモデル化でき、非常にまれにしか変更されない場合、独自のテーブルを持つポイントはありません。

場合によっては、学習プログラムに関する情報を追加したり、管理者に新しい学習プログラムを追加させたい場合は、それ自体のモデルとして優れています。

側の注意点として、私は非常に明確ではないんだし、それがコースにどのように関連するかどのような学習プログラム - より多くの情報をここにすることは、より良い答えにつながる可能性がある


コメントに基づいて編集:

study_programは何年も変わるとは思わない。また、他の情報を保存することもありません。必要な唯一の情報は、その場合にstudy_program

の名前であり、値がシンボルとして表すことができると仮定すると、「推奨」のストレージソリューションは、列挙型であろう - に格納されますデータベースを整数として、コードベースで定義された名前に置き換えます。欠点は、データベースが各数値の意味を知らないことで、一部のクエリが複雑になる可能性があることです。例えば、2つの研究プログラムに関連欠席を検索するには、あなたは

Absence.where(study_program: [ 
           Absence.study_programs[:some_program], 
           Absence.study_programs[:other_program], 
          ]) 

を行う必要があります(これはscopemapの適切な使用を容易にすることができる - 私は読者の練習として残しておきましょう!Absence.some_programはあなたsome_programにあるすべての欠席を返し、absence.some_program!は、列挙型を設定し、レコードを保存します - )

逆さまでは、便利なメソッドを得るか、です。

列挙型から離れて文字列データベースフィールドに値を格納する場合は、許可された値の配列を作成し、そのフィールドに検証があることを確認し、

class Absence < ApplicationRecord 
    belongs_to :user 
    belongs_to :course 

    STUDY_PROGRAMS = ['Some program', 'Another program'] 

    validates :study_program, inclusion: { in: STUDY_PROGRAMS } 
end 

これ以外の場合、学生は新しい文字列を投稿して独自の学習プログラムを作成することができます。また、登録フォームのAbsence::STUDY_PROGRAMSを使用できることを意味します。

あなたは便利な方法はありませんが、検索はもっと便利になります。フィールドがインデックスに登録されていることを確認してください。

+1

ご意見ありがとうございます。私はstudy_programがずっと変わっていくとは思わない。また、他の情報を保存することもありません。必要な情報は、study_programの名前だけです。 – Toontje

関連する問題