2011-05-24 51 views
0

我仍然无法在ActiveRecord中构建复杂的连接。加入其他模型的朋友

我有一个使用Steve Ehrenberg(http://dnite.org)的HasManyFriends插件的用户模型。

然后我有一个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 

谢谢! 奥古斯托

+0

为什么这不只是User.feed_events? – Yule 2011-05-24 10:01:13

+0

这是完美列出特定用户的FeedEvents,我想要列出特定用户的所有朋友的所有FeedEvents。类似于:User.friends.feed_events(但这不起作用)。 – Augusto 2011-05-24 10:05:37

回答

0

我找到了工作,更传统的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) 

如果你做同样的一个更有效的/更优雅的方式,请让我知道!

+0

或者你可以使用'has_many:friend_feeds,:class =>“FeedEvent”,:finder_sql => ... '如[has_many]所示(http:// apidock。com/rails/ActiveRecord/Associations/ClassMethods/has_many)文档,所以你可以使用'current_user.friend_feeds' – Laas 2011-05-25 12:30:29

1

通过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查询。

+0

谢谢啦! 我想你的解决方案,但我得到这个错误,我不知道如何解决它:( 的ActiveRecord :: HasManyThroughSourceAssociationMacroError:无效源反射宏:的has_many:通过对的has_many:feed_events_of_friends_by_me,:通过=>:friends_by_me。使用:source来指定源反射 – Augusto 2011-05-24 13:41:49

+0

也许我误解了源代码,或者自你的版本以来它已经发生了变化(我从GitHub中查找了它)。你需要做的是查找(例如在控制台中)什么是这个关系指向朋友的一种方式和另一种方式,然后适当地改变代码 – Laas 2011-05-24 17:54:13

+0

你是什么意思的“关系的名称指向朋友的方式和其他方式”?在我的控制台做用户friends_by_me有效,但在关系中使用它会导致以前的错误。 – Augusto 2011-05-24 18:03:46