Ruby on Rails: отношения «один ко многим», но я хочу получить только учеников и 1 домашнее задание

#ruby-on-rails #ruby #one-to-many

#ruby-on-rails #ruby #один ко многим

Вопрос:

У меня есть 2 объекта, студент и домашнее задание. Это отношение «один ко многим», при котором у ученика может быть много домашних заданий

Я пытаюсь использовать .найдите метод для получения всех учеников и только одного домашнего задания, которое у него есть.

Я знаю, что могу использовать Student.find(:all, :include =>:домашние задания). Но это вернет мне ученика и все его домашние задания.

Комментарии:

1. Это больше похоже на отношения «многие ко многим». Для меня у предмета может / должно быть много учеников.

2. согласен.. думаю, это должно быть много для многих

3. Поэтому переформулируйте свой вопрос (и название). Решение должно быть: создано правильным образом (с has_many :through отношениями), вы можете сделать: s = Subject.find(2); s.students получить всех учеников по одному предмету.

4. Я только что отредактировал свой вопрос. Извиняюсь за путаницу.

Ответ №1:

Если ваше отношение «один ко многим», вы не можете выбрать только одно, не решив, какое оно должно быть (например, первое, если вы заказываете их по идентификаторам). Если это так, вы можете использовать #first метод для отношения:

 Student.find(:all, :include => :homeworks).each {|student| student.homeworks.first}
  

Если вы имеете в виду извлечение только одного предмета для каждого учащегося из базы данных, это скорее проблема SQL. Вам нужно будет написать предложение «ON», которое будет выбирать один предмет по вашему критерию.

Комментарии:

1. привет @samuil. я пробовал Student.find(:all, :include => :homeworks).each {|student| student.homeworks.first} , что все еще есть объекты Student, которые возвращают мне массив из более чем 1 домашних заданий. Есть ли что-то, что я пропустил или не понял?

2. Это решение извлечет все данные из вашей базы данных, это просто способ удалить все данные, которые вы не используете. Если вы заботитесь в этом решении о производительности, вам нужно написать гораздо более сложный запрос.

Ответ №2:

Если вас не волнует производительность, тогда ваше решение в порядке. Извлеките всю запись и просто используйте первую в своих представлениях или контроллерах

Если вы заботитесь о производительности (извлечение большого количества объектов обходится дорого), вы можете добавить другое отношение first_homework или latest_homework (добавление нового столбца latest_homework_id в схему вашей таблицы) и заполнять его правильным идентификатором каждый раз, когда ученику назначается новое домашнее задание (или домашнее задание выполнено или когдаэто имеет смысл для вашей логики приложения)

Комментарии:

1. Добавлять такой столбец — плохая идея, если только невозможно определить, какое домашнее задание является последним (путем сортировки их по идентификатору или created_at). Это просто немного усложняет запрос.