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 %>

次に、「すべてのアクティビティ」であるページに4番目のフィードを作成します。このフィードには、作成日(desc)でソートされた1つのフィードにPlays、Wants、Ratingsが表示されます。

これを行うための最良の方法についての助けは素晴らしいでしょう。

更新:各モデルから要求されたコードに従って、今は素晴らしくシンプルです:

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

これを行うには、すばやく簡単な方法とリファクタリングされた方法の2つの方法が考えられます。

すばやく簡単な方法は、3つのそれぞれからのすべての結果の配列を作成し、それを日付で並べ替えることです。したがって、次のようなものがあります。

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

次に、ビューコードは、使用するテキストを把握するために、各アイテムにそのクラスが何であるかを尋ねることができます。

リファクタリングされた方法は、3つのクラスがほぼ同一であることに気付くことです。実際、PlayとWantは名前を除いて同一であり、Ratingは1つの列のみを追加します。したがって、3つすべてにスーパークラスを追加します。STIを使用してデータベーステーブルを単一のテーブルにマージするには、巧妙な移行を行う必要がある場合がありますが、長期的なソリューションとしてはより優れている場合があります。

于 2012-10-07T18:52:34.753 に答える