2

我有一个页面有几个“提要”。在我的控制器中,我有这样的东西:

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

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

   <% @plays.each do |play| %>
          You played <%= play.game.name %></p>
   <% end %>

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

任何有关执行此操作的最佳方法的帮助都会很棒。

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

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
4

2 回答 2

2

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

@activities = (@plays + @wants + @ratings).sort_by {|a| a.created_at}.reverse
于 2012-10-07T18:49:28.183 回答
0

我可以想到两种方法来做到这一点,快速简便的方法和重构的方法。

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

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

然后你的视图代码可以询问每个项目它的类是什么来确定使用哪个文本。

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

于 2012-10-07T18:52:34.753 回答