Верните новый массив из Tweets.все и зациклите его в view Rails

#arrays #ruby-on-rails

#массивы #ruby-on-rails

Вопрос:

Я пытаюсь создать новый массив, который будет содержать только твиты пользователей, на которых вы подписаны, но я не уверен, как это должно быть сделано или, если возможно, и использовать этот массив для цикла, на мой взгляд

tweets_controller.rb

   def index
    @tweet = Tweet.new
    
    Tweet.all.each do |tweet|
        if current_user.following?(tweet.user) || (current_user.username === tweet.user.username)  
          return @tweets << tweet
        end
      end  
  end
  

tweets/index.html.erb

 <div class="tweets-container">
  <% @tweets.each do |tweet| %>
      <div class="tweet-feed-container">
        <strong><%= link_to "@#{tweet.user.username}", user_path(tweet.user), :class => 'tweet-username' %></strong>
        · <small><%= tweet.created_at.strftime("%b %d, %Y %I:%M %p") %></small><br/>
        <%= tweet.body %>

        <% tweet.tags.each do |tag| %>
          <%= link_to "#{tag.name}", tag_path(tag), :class => 'tweet-tag' %>
        <% end %>

        <% tweet.mentions.each do |mention| %>
          <%= link_to "#{mention.name}", user_path(mention.name.sub('@', '')), :class => 'tweet-tag' %>
        <% end %>

        <%= link_to '↺', retweet_tweet_path(tweet.id), method: :post, :class => 'tweet-delete' %>
        <%= link_to 'X', tweet_path(tweet), method: :delete, :class => 'tweet-delete' if current_user == tweet.user %>        
      </div>
  <% end %>
</div>
  

Комментарии:

1. Привет @ayabbear, не могли бы вы поделиться своей моделью твитов и моделью пользователя с relation? Это еще один метод following? .

2. @PalashBera обязательно отредактирует сообщение в одну секунду

3. привет @PalashBera, stackoverflow не позволит мне публиковать коды, говорит, что у меня слишком много кода, вы можете проверить это здесь github.com/ayabbear/tweeter

Ответ №1:

вы можете использовать это:

 # app/controllers/tweets_controller.rb

def index
  @tweet = Tweet.new
  @tweets = Tweet.joins(user: :followees).where("followees.follower_id = ? OR tweets.user_id = ?", current_user.id, current_user.id).distinct
end
  

Комментарии:

1. привет, палаш! спасибо за ответ, он выдает мне ошибку «неправильное количество аргументов (задано 0, ожидается 1)»

2. Я думаю, вы совершаете ошибку в другом месте. Не могли бы вы вставить первые 3 строки вашей ошибки в комментарий?

3. Привет @ayabbear, я обновил ответ. Пожалуйста, попробуйте с этим.

4. привет, палаш! похоже, я получаю синтаксическую ошибку, я не уверен, куда поместить открывающую скобку или должна ли быть закрывающая скобка

5. Вы можете попробовать с моим ответом.

Ответ №2:

Это вернет все твиты пользователей, которым следует current_user

 @tweets = Tweet.where(user_id: current_user.followees.select(:id))
  

Если вы хотите также включить твиты current_user, используйте запрос ниже

 @tweets = Tweet.where(user_id: current_user.followees.select(:id)).or(Tweet.where(user_id: current_user.id))
  

Комментарии:

1. привет! спасибо за ответ, но я думаю, что этот отличается, он возвращает пользователей, у которых есть подписчики. то, что мне нужно, было больше похоже на фильтр, чтобы отображать только твиты пользователей, за которыми я слежу

2. @ayabbear ой, я виноват.. Я обновил свой ответ, не могли бы вы проверить сейчас?

3. привет, сампат! отлично! первый работает! но во втором я получаю сообщение об ошибке «неправильное количество аргументов (задано 0, ожидается 1)», я думаю, что это второй, который мне нужен

4. @ayabbear Я обновил свой ответ, не могли бы вы проверить сейчас?

5. ты спасаешь жизнь, Сампат, спасибо тебе! Теперь он работает отлично!