Я использовал методы связывания ActiveRecord (например, в этом посте Записки Райана ), чтобы выполнить некоторые из моих более сложных ассоциаций 2-го уровня, минимизируя при этом количество запросов. Например, я использую следующую связь, чтобы получить все действия от каждого, за кем следует пользователь (follow - это модель, которая содержит только user_id и follow_user_id):
class User < ActiveRecord::Base
<other associations, code, etc>
has_many :follows do
def activities(reload=false)
@followed_activities = nil if reload
@followed_activities ||= Activity.includes(:user, :comments, :comment_users).where(:user_id.in => self.collect {|e| e.followed_user_id}).order('activities.created_at DESC')
end
<.....>
end
Этот метод сработал фантастически, нареканий нет. Однако клиент попросил включить действия самого пользователя (действия follow_users + действия current_user).
Я понимаю, что это, вероятно, ruby 101, но я не могу понять, как получить доступ к User.id из родительской (User) модели. Как видно из кода, self
ссылается на следующее отношение и возвращает список совпадающих строк из следующей таблицы.
Я вроде как заставил его работать иногда, изменив следующую строку:
@followed_activities ||= Activity.includes(:user, :comments, :comment_users).where(:user_id.in => (self.collect {|e| e.followed_user_id}) << self.first.user_id).order('activities.created_at DESC')
Однако, это а) кажется очень хакерским, и б) вызывает исключение, когда нет никаких последующих записей (что всегда имеет место с новым пользователем). Как еще я могу получить идентификатор пользователя?