стремятся загрузить небольшое подмножество всех объектов has_many в зависимости от условий - PullRequest
1 голос
/ 14 августа 2010

Как я могу загружать только некоторые объекты в отношении has_many?

По сути, у меня есть четыре объекта: Assignment, Problem, AssignmentUser и ProblemUser.

#assignment.rb
has_many :problems
has_many :assignment_users

#assignment_user.rb
belongs_to :assignment
belongs_to :user
has_many :problem_users

#problem.rb
belongs_to :assignment
has_many :problem_users

#problem_user.rb
belongs_to :user
belongs_to :problem
belongs_to :assignment_user
attr_accessor :complete #boolean

На странице, отображающей одно назначение, я хочу показать все проблемы, а также статус пользователя по каждой проблеме, если она существует. (Это может не произойти, если пользователь впервые просматривает страницу.)

Я не могу позвонить assignment_user.problem_users, а затем разобраться в проблемах так:

-@assignment_user.problem_users.each do |problem_user|
    = check_box_tag "problems[#{problem_user.problem.id}]", 1, problem_user.complete
    = link_to problem_user.problem.name, assignment_problem_path(assignment_id => problem_user.problem.assignment_id, :id => problem_user.problem_id)

потому что не может быть ProblemUser записей для каждого Problem, который принадлежит назначению; создание всех этих ProblemUser объектов всякий раз, когда кто-то создает Problem объект, будет расточительным, поэтому они создаются только на лету.

Я хочу иметь возможность перебирать Problems, которые принадлежат конкретному Assignment, затем для каждого Problem найти ProblemUser, который соответствует ... но без создания N + 1 проблема. Я мог бы создать два массива, один со всеми проблемами и один со всеми problem_users, но тогда я должен был бы сопоставить их, верно? Может быть, это лучший способ ... но любые рекомендации по лучшим практикам приветствуются здесь.

1 Ответ

0 голосов
/ 27 января 2011

Попробуйте использовать : включите что-то вроде ...

#assignment.rb
has_many :problems, :include => :problem_user
has_many :assignment_users

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

Assignment.find(1).problems.collect { |a| [a.assignment.description, a.description, a.problem_user.description] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...