2015-01-26 3 views
0

Следующий метод и ассоциация выполняют одно и то же. Они оба делают метод «active_students» доступным для текущей школы. Тем не менее, ассоциация использует 125 запросов, и метод использует 1. Метод использует eager-load, но ассоциация, похоже, больше подходит для рельсов.Rails 4 eager loading (ассоциация против метода) эффективность

Почему школьные данные настолько неэффективны по сравнению с построением запроса с учетной записи? Возможно ли поддерживать связь и использовать на ней нетерпеливую нагрузку? Является ли мой метод подходящим, или есть лучший способ приблизиться к этому?

# application_controller 

    def active_students # 1 query 
    # used by simply calling active_students 
    Account.includes(:role, {user: :school}).where(status: 0).where("roles.name = ?", 'student').where("users.school_id = ?", current_school.id).references(:role, :user, :school) 
    end 

против
# school.rb 
    # used by calling current_school.active_students 
    # 125 queries 

    has_many :active_students, -> { joins(:role).where("roles.name = ? AND accounts.status = ?", "student", 0) }, source: :accounts, through: :users 

ответ