Присоединение друзей к другим моделям - PullRequest
0 голосов
/ 24 мая 2011

У меня все еще проблемы с созданием сложных объединений в ActiveRecord.

У меня есть модель User, использующая плагин HasManyFriends от Стива Эренберга (http://dnite.org).

Тогда у меня есть модель UserFeedEvent, которая связывает пользователей с моделью FeedEvent.

Чего я хотел бы добиться, так это найти все FeedEvents, связанные с друзьями пользователя .

Как мне написать свой запрос ActiveRecord?

Вот мои модели:

class User < ActiveRecord::Base

  has_many_friends

  has_many :feed_events, :through => :user_feed_events, :dependent => :destroy
  has_many :user_feed_events, :dependent => :destroy

end


class UserFeedEvent < ActiveRecord::Base

  belongs_to :feed_event, :dependent => :destroy
  belongs_to :user

end


class FeedEvent < ActiveRecord::Base
  has_many :user_feed_events, :dependent => :destroy
  has_many :users, :through => :user_feed_events

  serialize :data
end

Заранее спасибо! Augusto

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Копание через Источник HasManyFriends заставляет меня поверить, что следующее должно работать (или быть на полпути):

РЕДАКТИРОВАТЬ: обнаружил, что source не может указывать на другую :has_many :through ассоциацию. Так что вы можете попробовать обновленную версию.

class User < ActiveRecord::Base
  #...
  has_many :user_feed_events_of_friends_by_me, :through => :friends_by_me,
    :source => :user_feed_events
  has_many :feed_events_of_friends_by_me, :through => :user_feed_events_by_me

  has_many :user_feed_events_of_friends_for_me, :through => :friends_for_me,
    :source => :user_feed_events
  has_many :feed_events_of_friends_for_me, :through => :user_feed_events_for_me

  # A wrapper to return full list of two-way friendship events
  def feeds_events_of_my_friends
    self.feed_events_of_friends_by_me + self.feed_events_of_friends_for_me
  end
end

К сожалению, плагин HMF имеет две односторонние дружеские ссылки, что означает, что полный список требует 2 запроса к БД.

0 голосов
/ 24 мая 2011

Я нашел работающее и более традиционное решение SQL:

friends_id = current_user.friends.collect {|f| f.id}.join(",")

sql = "SELECT feed_events.*, user_feed_events.user_id  FROM feed_events LEFT JOIN user_feed_events ON feed_events.id = user_feed_events.feed_event_id WHERE user_feed_events.user_id IN (#{friends_id}) GROUP BY feed_events.id ORDER BY feed_events.created_at DESC"

friend_feed_events = FeedEvent.paginate_by_sql(sql, :page => params[:page], :per_page => 30)

Если у вас есть более эффективный / более элегантный способ сделать то же самое, пожалуйста, дайте мне знать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...