У меня есть модель пользователя и модель CD, соединенные через таблицу соединений 'cds_users'. Я пытаюсь вернуть хэш пользователей плюс каждый диск, который у них общего с исходным пользователем.
@user.users_with_similar_cds(1,4,5)
# => {:bob => [4], :tim => [1,5]}
Есть ли лучший / более быстрый способ сделать это без много циклов? Может быть, более прямой путь?
def users_with_similar_cds(*args)
similar_users = {}
Cd.find(:all, :conditions => ["cds.id IN (?)", args]).each do |cd|
cd.users.find(:all, :conditions => ["users.id != ?", self.id]).each do |user|
if similar_users[user.name]
similar_users[user.name] << cd.id
else
similar_users[user.name] = [cd.id]
end
end
end
similar_users
end
[дополнение]
Принимая идею модели соединения, я мог бы сделать что-то вроде этого. Я назову модель "присоединился".
def users_with_similar_cds(*args)
similar_users = {}
Joined.find(:all, :conditions => ["user_id != ? AND cd_id IN (?)", self.id, args]).each do |joined|
if similar_users[joined.user_id]
similar_users[joined.user_id] << cd_id
else
similar_users[joined.user_id] = [cd_id]
end
end
similar_users
end
Это был бы самый быстрый способ для больших наборов данных?