Как я могу загружать только некоторые объекты в отношении 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, но тогда я должен был бы сопоставить их, верно? Может быть, это лучший способ ... но любые рекомендации по лучшим практикам приветствуются здесь.