问题描述
|
我仍然无法在ActiveRecord中建立复杂的联接。
我有一个使用Steve Ehrenberg(http://dnite.org)的HasManyFriends插件的用户模型。
然后,我有一个UserFeedEvent模型,该模型将用户链接到FeedEvent模型。
我要实现的是找到链接到用户朋友的所有FeedEvent。
我应该如何编写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
提前致谢!
奥古斯托
解决方法
挖掘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个DB查询。
,我找到了一个可行的,更传统的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)
如果您有更有效/更优雅的方法,请告诉我!