Rails:从多个模型创建“所有活动源”

我有一个页面有几个“Feeds”。 在我的控制器中我有这样的事情:

def index @plays = current_user.plays.includes(:game).order("created_at desc") @wants = current_user.wants.includes(:game).order("created_at desc") @ratings = current_user.ratings.includes(:game).order("created_at desc") end 

我在视图中使用这样的代码:

   You played 

现在,我想在“所有活动”页面上进行第四次提要,该页面在按创建日期(desc)排序的一个Feed中显示“播放”,“想要”和“评级”。

任何有关最佳方法的帮助都会很棒。

更新:从每个模型请求的代码,现在很好,很简单:

 class Play < ActiveRecord::Base attr_accessible :game_id, :user_id, :description belongs_to :user belongs_to :game end class Rating < ActiveRecord::Base attr_accessible :game_id, :id, :score, :user_id, :description belongs_to :user belongs_to :game end class Want < ActiveRecord::Base attr_accessible :game_id, :user_id, :description belongs_to :user belongs_to :game end 

由于这些来自单独的表,您将无法在数据库查询中对它们进行排序。 但由于您已经拥有了每个数组,因此可以使用Ruby进行组合和排序:

 @activities = (@plays + @wants + @ratings).sort_by {|a| a.created_at}.reverse 

我可以想到两种方法,快速简便的方法和重构的方式。

快速简便的方法是从三者中的每一个构建一个包含所有结果的数组,然后按日期对其进行排序。 所以你可以有类似的东西:

 @items = [] << @plays << @wants << @ratings @items.sort_by { |item| item.created_at } 

然后,您的视图代码可以询问每个项目的类,以确定要使用的文本。

重构的方式是注意到你的3个类几乎相同 - 事实上,除了名称之外,Play和Want是相同的,而Rating只添加一个列。 因此,为所有3添加超类。您可能需要进行巧妙的迁移,以使用STI将数据库表合并到单个表中,但它可能是更好的长期解决方案。