2017-09-21 3 views
0

나는 학생들로 하여금 시험에 결석을 등록 할 수있게 해주는 Rails 애플리케이션을 연구 중이다.study_program을 Rails 애플리케이션으로 모델링하는 방법

<%= 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 %> 
:

은 당신이 볼 수 있듯이

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 

, 내가 등록 양식은 다음과 같이 보이는 join_table 사용자에 foreign_key를 보유하고 결석 및 코스

을 사용하고 모델입니다

이제 학생도 학습서를 등록 양식에 입력 할 수 있어야합니다. 그러나 이것을 구현하는 가장 좋은 방법은 무엇인지 모르겠습니다. 부재 테이블에 필드 ('study_program')를 추가해야합니까? 아니면 study_program을 자체 모델 (StudyProgram 클래스)으로 모델링해야합니까?

등록 양식의 선택 상자에서 자신의 study_program을 선택하기 위해 결석을 등록 할 때 어떤 조언도 환영합니다. 당신의 도움에 대한

덕분에,

여기

앤서니

답변

2

일반적인 규칙입니다 : 연구 프로그램은 자신의 정보를 저장하는 건가요? 사용 가능한 학습 프로그램 목록이 변경 될 예정입니까?

study_program을 열거 형으로 모델링 할 수 있으며 매우 드물게 변경되는 경우 자체 테이블이있는 지점이 없습니다.

언젠가 학업 프로그램에 대한 추가 정보를 원하거나 관리자가 새 학습 프로그램을 추가하려는 경우 자체 모델로 더 좋습니다. 보조 노트로

, 나는 학습 프로그램이 무엇인지 아주 명확하지 않다 그것은 과정에 어떻게 관련되는지 - 자세한 내용은 여기 의견에 따라 더 나은 답변


편집으로 이어질 수 있습니다

study_program이 지난 몇 년 동안 많이 바뀔 것이라고 생각하지 마십시오. 다른 정보도 저장하지 않을 것입니다. 에 기억된다 - 필요한 정보 만이, 값이 기호로 표현 될 수 있다고 가정하는 경우에 study_program

의 이름은 "추천"저장 용액 열거 될 데이터베이스를 정수로, 코드베이스에 정의 된 이름으로 단점은 데이터베이스가 각 숫자의 의미를 알지 못해 일부 쿼리를 복잡하게 만들 수 있다는 것입니다. 예를 들어, 두 개의 학습 프로그램과 관련된 결석을 검색하려면

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