2016-09-13 1 views
0

レール4/5では、アイテムのリストを表示しようとしています。検索ユーザーがこれらのアイテムそれを私の索引のどこかに表示する。これは、投稿のフィードを表示して、私が既に投稿を好きだったかどうかを確認するソーシャルネットワーク、またはアイテムのリストを表示して、アイテムをリストに保存したかどうかを確認できるようにします。アイテムのインデックスを作成するときに、ユーザーが好きなものや星を付けたものを表示する方法

単純な例として、UserPostLikedPostの結合モデルがあるとします。ユーザーは投稿を作成し、他のユーザーは投稿を好きにすることができます。ユーザーとして、投稿を見て、その記事の1つが好きかどうかを確認することができます。

@posts = Post.includes(:liked_posts) 
      .where('liked_posts.user_id = ?', current_user.id) 
      .references(:liked_posts) 

をしかし、それは実際にのみ私に私が言ってきた記事を表示するクエリを実行します。

理論的には、このようなものが動作するはずです。他の投稿は除外されます。

私は奇妙なことに、オンラインで関連するものを見つけるのに苦労しています。私が見つけることができるのは、基本的に「あなたはSQLを書く必要があります。任意のヒント/アドバイス?

答えて

0

okですので、インデックスページには投稿のリストがありますか?それぞれのポストのために...あなたは名前か何かを表示しますか?なぜのようなものはありませ:ポストモデルでは、名前の次のページで

<%= image_tag 'heart.png' if post.liked_by?(current_user) %> 

def liked_by?(user) 
    self.liked_posts.where(:user_id => user.id).exists? 
end 

のようなもの(注:タイプミスとマイナーなバグのためにチェックされていない)

+1

ありがとうございます!それはかなり単純ですが、私はそれがn + 1のクエリの問題を引き起こすと信じています。トラフィックが少なくなると、それは良いトレードオフになるかもしれません。 –

+0

ええ確かに、それは問い合わせを増やすだろう - しかし、これは「最初にそれを行うと、それがボトルネックを作成した場合、それがない場合は、後でそれを最適化参照」の状況である:D –

+1

おかげで - もちろん、それは間違いなく正しいアプローチです!私は最小限のデータベースクエリでこの問題を解決する方法を考え直しましたが、それはあまりにも複雑なコントローラアクションです。私はあなたの考えに感謝します! –

0

I私は別の解決策を考えていたと思うので、誰かがこの問題を抱えている場合にはここに投稿していますが、この解決法はあまり気にしません。

とにかく、私のインデックスは次のようになります。

def index 
    @posts = Post.all # in reality, paginated or limited 
    these_posts = [] 
    @posts.each do |post| 
    these_posts << post.id 
    end 

    @liked_posts = LikedPost.where(user_id: current_user) 
          .where(post_id: these_posts) 

    @liked_posts_hash = Hash.new(false) 
    @liked_posts.each do |liked_post| 
    @liked_posts_hash[liked_post.post_id] = true 
    end 

    @posts.each do |post| 
    post.liked = @liked_posts_hash[post.id] #liked is an attr_accessor 
    end 
end 

だから、それはタリンの非常にクリーン応答に比べて余分な複雑さのトンです。しかし、(あなたのposts配列を2回、あなたのliked_posts配列を1回実行するという犠牲を払って)、データベースクエリはn + 1の代わりに2つに制限されます。

私の開発マシンでは、この方法で20個の記事を表示する方法は、オブジェクトごとのクエリで約100msと130msのどちらかをとるため、25%速くなりますがどちらのアプローチも実際のレコードがほとんどない開発データベース。

私も、これをクリーンアップの考えをいただければと思います。

関連する問題