Я создаю метод рекомендаций для пользователей в моем проекте.Пользователи создают записи по интересам всякий раз, когда они просматривают, создают, комментируют или взаимодействуют с объектами (взвешенными в зависимости от действия).
Я написал метод find, который просматривает интересы пользователя, а затем находит пользователей, которые такжезаинтересованы в этих пунктах.Тем не менее, это ужасно неэффективно, делать столько вызовов дб, сколько интересует пользователь (до 50).
Вот урезанная версия того, что происходит:
#User.rb
...
has_many :interests, :as => :interestable, :dependent => :destroy
def recommendations
recommendations = []
Interest.for(self).limit(50).each do |item|
recommendations << Interest.other_fans_of(item)
end
user_ids = recommendations.flatten.map(&:user_id).uniq
end
...
#interest.rb
...
belongs_to :user
belongs_to :interestable, :polymorphic => true
named_scope :for, lambda { |user| { :conditions => { :user_id => user.id } } }
named_scope :limit, lambda { |num| { :limit => num } }
named_scope :other_fans_of, lambda { |interest| { :conditions => { :interestable_type => interest.interestable_type, :interestable_id => interest.interestable_id } } }
default_scope :order => "weight DESC"
...
Есть ликакие-нибудь гении sql, которые могут превратить это в один хороший чистый вызов БД?