Я хочу показать записи внуков на странице показа бабушек и дедушек ... что я делаю не так? - PullRequest
1 голос
/ 28 февраля 2020

В моем коде у пользователя есть ученики, у ученика есть дневники, у дневников есть diary_entries. Я хочу показать дневниковые записи каждого ученика на странице показа ученика. Ниже представлены мои модели.

Student.rb Модель

class Student < ApplicationRecord
  belongs_to :user
  has_many :diaries, dependent: :destroy
  has_many :teams, dependent: :destroy
  has_many :subjects, dependent: :destroy
  belongs_to :grade

  accepts_nested_attributes_for :diaries
  accepts_nested_attributes_for :subjects
  accepts_nested_attributes_for :teams
end

Diary.rb Модель

class Diary < ApplicationRecord
    belongs_to :student
    belongs_to :user
    belongs_to :grade
    has_many :diary_entries

    validates :diary_year, presence: true

    def self.from_student(owner, student_obj)
        new(
            user_id: owner.id,
            student_id: student_obj.id,
            grade_id: student_obj.grade_id,
            diary_year: Date.today.year
        )
    end

end

Diary_entry.rb Модель

class DiaryEntry < ApplicationRecord
  belongs_to :diary
  belongs_to :subject
  belongs_to :user

  validates :lesson_date, :assignment, :assignment_due_date, :notes_to_parents, presence: true
end

Контроллер дневников

class DiariesController < ApplicationController
  before_action :authenticate_user!
  before_action :set_student

  def create
    @diary = Diary.from_student(current_user, @student)
    @diary.save
    redirect_to @student, notice: "Diary was successfully created."

  end

  private

  def set_student
    @student = Student.find(params[:student_id])
  end
end

Контроллер учеников # show

 def show
    @diary = @student.diaries
    @diary_entries = @diary.diary_entries
  end

Контроллер Diary_entries #index и Show

  def index
    @diary_entries = @diary.diary_entries.all
  end

  def show
    @diary_entry = DiaryEntry.find(params[:id])
  end

Я хочу, чтобы у каждого студента был только 1 дневник в год , поэтому я добавил столбец diary_year в каждый дневник, а затем добавил уникальный индекс для student_id и year в таблице дневников.

  create_table "diaries", force: :cascade do |t|
    t.bigint "user_id"
    t.bigint "student_id"
    t.bigint "grade_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "diary_year"
    t.index ["grade_id"], name: "index_diaries_on_grade_id"
    t.index ["student_id", "diary_year"], name: "index_diaries_on_student_id_and_diary_year", unique: true
    t.index ["student_id"], name: "index_diaries_on_student_id"
    t.index ["user_id"], name: "index_diaries_on_user_id"
  end

Ниже приведена моя попытка l oop на странице показа учеников.

<div class="card">
   <div class="card-body">

     <% @diary_entries.each do |entry| %>
       <li><%= entry.assignment %></li>
     <% end %>
   </div>
 </div>

Я хочу иметь возможность: 1. У каждого студента должен быть только 1 дневник в год, 2. Показывать diary_entries под каждой страницей студентов.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Вы хотите показать diary_entries из Student, используйте joins

@diary_entries = DiaryEntry.joins(diary: :student)
                           .where(students: { id: @student.id })

Подробнее о соединениях - https://guides.rubyonrails.org/active_record_querying.html#joins

Дайте ему попробовать!

1 голос
/ 28 февраля 2020
  1. Получите от каждого учащегося только 1 дневник в год,

Для принудительного применения одного объекта Дневника в год вы можете добавить before_validation в модель Дневника. См. Обратные вызовы

Обратный вызов должен вызывать частную функцию, которая проверяет существующие записи, которые могут конфликтовать.

def ensure_valid_year
  return unless student.diaries.where(diary_year: diary_year).any?
  # code or function call here to handle rejection of the new Diary object
end
Отображение diary_entries под каждой страницей студентов.

Вы можете добавить еще одну связь в модель Student.

has_many :diary_entries, through: :diaries

Вы можете получить доступ к связанным объектам DiaryEntry, таким как итак:

student1 = Student.first
student1.diary_entries
...