RailsでTwitter風のSNSアプリを作っているのですが、
1.フォローしているアカウントのツイート
2.自分のツイート
3.フォローしているアカウントがリツイートしたツイート
をタイムラインに表示させるために一度それぞれでActiveRecodeRelationで取得したツイートをハッシュ化し、大元の1つの配列に入れているのですが、
1と3でツイートが重複する事があり、例えば自分がフォローしている二人がそれぞれのツイートをリツイートし合った場合に1にも3にも該当のツイートが格納される事になり、同じツイートが2回3回...と格納されてしまいます。
図で表すと
大元の配列[
-ハッシュ{
--id:1 , body:〇〇}
-ハッシュ{
--id:1 , body:〇〇 retweet:true(リツイートで流れたツイートか否かを判別するキー)}
-ハッシュ{
--id:2 , body:△△}
-ハッシュ{
--id:3 , body:□□}]
簡単に表すとこのような状況なのですが、これをそのままArray.uniqメソッドを使うと、
ハッシュの中の重複しているidの部分だけが削除されて、残りのbodyその他の部分は残ったままです。(ハッシュ自体が消されるわけではない)
理想の挙動としては、idが重複しているハッシュがある場合、retweetではない純粋なツイートのみを残すような書き方をしたいのですが、
いい方法が見つかりません。同じような経験をされている方いましたらご教授願いたいです。
現在のコード
ruby
1 @user = current_user 2 @users = @user.followings 3 @following_user_id = [] 4 @users.each do |following| 5 @following_user_id.push(following.id) 6 end 7 @following_user_id.push(current_user.id) 8 @retweet_ids = Retweet.where(user_id: @following_user_id) 9 @tweet_array = [] 10 @tweet_hash = Hash.new{[]} 11 @retweet_ids.each do |retweet_id| 12 @tweet_hash = Hash.new{[]} 13 @tweet_hash["id"]=retweet_id.tweet.id 14 @tweet_hash["body"]=retweet_id.tweet.body 15 @tweet_hash["user_id"]=retweet_id.tweet.user_id 16 @tweet_hash["status"]= 1 17 @tweet_hash["status_by"]= retweet_id.user_id 18 @tweet_hash["score"]= retweet_id.tweet.score 19 @tweet_hash["created_at"]= retweet_id.tweet.created_at 20 @tweet_hash["updated_at"]= retweet_id.tweet.updated_at 21 @tweet_array.push(@tweet_hash) 22 end 23 24 @follow_tweets = Tweet.where(user_id: @following_user_id) 25 26 @follow_tweets.each do |follow_tweet| 27 @tweet_hash = Hash.new{[]} 28 @tweet_hash["id"]=follow_tweet.id 29 @tweet_hash["body"]=follow_tweet.body 30 @tweet_hash["user_id"]=follow_tweet.user_id 31 @tweet_hash["status"]= 0 32 @tweet_hash["score"]= follow_tweet.score 33 @tweet_hash["created_at"]= follow_tweet.created_at 34 @tweet_hash["updated_at"]= follow_tweet.updated_at 35 @tweet_array.push(@tweet_hash) 36 end 37 @tweets = @tweet_array.sort_by! {|h| h["updated_at"]}.reverse
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/23 00:21
2020/03/23 00:26
2020/03/23 01:19
2020/03/23 01:29