2016-12-21 101 views
0

我面臨一個問題,我不知道如何解決它。通過相同的模型兩個has_many關係

我有三個型號

  • 教師
  • 客房
  • 小時

我需要他們通過相同的模型相關聯。到目前爲止,我有一個叫做日程表的第四個模型,我有兩個外鍵。 teacher_id和hour_id,這是完美的工作,但我也需要通過此模型關聯房間。

這裏是我的代碼:

teacher.rb

class Teacher < ApplicationRecord 
    scope :active, -> {where(deleted_at: nil)} 
    has_many :schedules, dependent: :destroy 
    has_many :lesson_hours, through: :schedules 
    has_many :teacher_courses, dependent: :destroy 
    has_many :courses, through: :teacher_courses 
    has_many :registrations 

    def check_associations 
    errors.add(:base, "Há matrículas cadastradas com esse professor. Por favor ajuste antes de deletar.") if self.registrations.active.count > 0 
    return errors.blank? 
    end 

    def delete! 
    if check_associations 
     self.deleted_at = Time.current 
     save! 
     return true 
    else 
     return false 
    end 
    end 
end 

room.rb

class Room < ApplicationRecord 
    scope :active, -> {where(deleted_at: nil)} 
    has_many :room_courses, dependent: :destroy 
    has_many :courses, through: :room_courses 
    has_many :registrations 

    def check_associations 
    errors.add(:base, "Há matrículas cadastradas com essa sala. Por favor ajuste antes de deletar.") if self.registrations.active.count > 0 
    return errors.blank? 
    end 

    def delete! 
    if check_associations 
     self.deleted_at = Time.current 
     save! 
     return true 
    else 
     return false 
    end 
    end 
end 

lesson_hour.rb

class LessonHour < ApplicationRecord 
    scope :active, -> {where(deleted_at: nil)} 
    has_many :schedules, dependent: :destroy 
    has_many :teachers, through: :schedules 
    has_many :registrations 

    def check_associations 
    errors.add(:base, "Há matrículas cadastradas nesse horário. Por favor ajuste antes de deletar.") if self.registrations.active.count > 0 
    return errors.blank? 
    end 

    def delete! 
    if check_associations 
     self.deleted_at = Time.current 
     save! 
     return true 
    else 
     return false 
    end 
    end 
end 

schedule.rb

class Schedule < ApplicationRecord 
    belongs_to :teacher 
    belongs_to :lesson_hour 
end 

所有這些協會正在通過這樣的形式,TeachersController

teachers_controller.rb

def set_lesson_days_and_hours 
    @lesson_days = LessonHour.select(:weekday) 
          .group(:weekday) 
          .order(:weekday) 
          .to_a 
    @lesson_hours = {} 
    @lesson_days.each do |ld| 
     @lesson_hours[ld.weekday] = LessonHour.active 
              .select(:id, :start_time) 
              .order(:start_time) 
              .where(weekday: ld.weekday) 
    end 
    end 

    def teacher_params 
    params 
     .require(:teacher) 
     .permit(:name, :address, :address_number, :address_complement, 
       :address_cep, :address_neighborhood, :city, :state, :birthdate, 
       :email, :cpf, :rg, :phone, :mobile, :started_date, :bank, :agency, 
       :account_number, :gender, lesson_hour_ids: [], course_ids: []) 
    end 

而且lesson_hour連結的形式構造老師如下:

<div class="row teacher-schedule"> 
    <h4>Disponibilidade</h4> 

    <% @lesson_days.each do |ld| %> 
    <div class="col-md-2 one-per-line teacher-schedule"> 
     <span><strong><%= t(:"date.day_names")[ld.weekday] %></strong></span> 
     <%= f.collection_check_boxes(:lesson_hour_ids, @lesson_hours[ld.weekday], :id, :start_time) do |check_box| %> 
     <%= check_box.label class:"label-checkbox" do %> 
     <%= check_box.check_box + check_box.text.strftime("%H:%M") %> 
     <% end %> 
     <% end %> 
    </div> 
    <% end %> 
    </div> 

所以,我的問題是,我怎樣才能在房間模型中包含房間關聯?

在此先感謝

回答

2

當你需要添加兩個的has_many你需要指定foreign_key和CLASS_NAME使導軌可以做連接。

實施例:

class TwoHasMany < ApplicationRecord 
    has_many :scheduled_teachers, foreign_key: :teacher_id, class_name: 'Schedule' 
    has_many :teachers, through: :scheduled_teachers 

    has_many :scheduled_lessons, foreign_key: :lesson_hour_id, class_name: 'Schedule' 
    has_many :lesson_hours, through: :scheduled_lessons 
end 
+0

尼斯,感謝安德烈。但我認爲如何管理它。我的觀點是新老師的一種形式,我需要以相同的形式添加房間和lesson_hours。現在我只有lesson_hours。 – Morris

相關問題