Предотвращение N + 1 запросов в Rails - PullRequest
3 голосов
/ 28 марта 2011

Я видел несколько примеров передачи значения хеша :include при вызове одного из методов ActiveRecord find в Rails. Однако я не видел примеров того, возможно ли это с помощью методов отношений. Например, допустим, у меня есть следующее:

def User < ActiveRecord::Base
  has_many :user_favorites
  has_many :favorites, :through => :user_favorites
end

def Favorite < ActiveRecord::Base
  has_many :user_favorites
  has_many :users, :through => :user_favorites
end

def UserFavorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :favorite
end

Все примеры, которые я вижу, показывают код следующим образом:

User.find(:all, :include => :favorite)

Но я не вижу примеров, показывающих использование отношений. Могу ли я вместо этого сделать что-то подобное?

User.favorites(:include => :user)

Ответы [ 2 ]

6 голосов
/ 28 марта 2011

Вы не можете использовать отношения как методы класса. Это методы экземпляра. Вы можете позвонить

@user.favorites

Посмотрите этот скринкаст о Eager Loading

http://railscasts.com/episodes/22-eager-loading

Это будет

 User.find(:all, :include => :favorites)

или для Rails 3.x

 User.includes(:favorites)
1 голос
/ 28 марта 2011

Вы можете добавить :include к ассоциациям вашей модели, чтобы загружать ассоциации второго порядка при загрузке объекта.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

...