如何在控制器中迭代数组

时间:2014-11-26 07:38:26

标签: ruby-on-rails ruby ruby-on-rails-4

我正在使用rails 4进行Twitter克隆练习。当用户登录时,在时间线上我只想显示他们关注的人(朋友)和他们自己的推文的推文,以DESC顺序。我使用tweets #index作为我的时间表。目前,我正在向用户显示数据库中的所有推文:

def index
  @tweets = Tweet.all.order("created_at DESC")
end

我添加了一个名为@user_friendships的实例变量,其中包含当前登录的用户朋友,然后我可以迭代并访问他们的推文。现在看来是这样的:

def index
  @user_friendships = current_user.user_friendships.all
  @tweets = Tweet.all.order("created_at DESC")
end

我不想循环访问user_friendship并抓住它的朋友,然后在视图中发推文,并循环播放current_users推文。

在控制器中,我希望有一个实例变量包含current_user和user_friendships中每个朋友推文的推文...所以在视图中我只需要遍历新数组。

型号代码

### User.rb

has_many :tweets

has_many :user_friendships
has_many :friends, through: :user_friendships

acts_as_voter

def to_param
  username
end

### user_friendship.rb

belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'


### tweet.rb

belongs_to :user

3 个答案:

答案 0 :(得分:1)

您没有显示tweetsusers之间的关系,但我认为您的用户有很多推文。然后,你可以这样做:

@tweets = Tweet.where(user_id: [current_user.id].concat(current_user.user_friendships.all.map(&:id)))

答案 1 :(得分:1)

def index
   @tweets = current_user.related_tweets.sort_by{|t| t.created_at}.reverse!
end
模型用户

中的

class User < ActiveRecord::Base
   # ...
   def related_tweets
      friends_tweets = friends.map{|f| f.tweets}
      return (tweets.to_a + friends_tweets).flatten
   end
   # ...
end

或其他解决方案,如果您不想使用数组

def index
   @tweets = Tweet.for_user(current_user).order(cretead_at: :desc)
end
模型推文中的

class Tweet < ActiveRecord::Base
   # ...
   def self.for_user user
      me_and_friends = [user.id] + user.friends.map(&:id)      
      where(:user_id => me_and_friends)
   end
   # ...
end

答案 2 :(得分:0)

您可以这样做:

def index
  @tweet_wall = Tweet.all.where(user_id: current_user.id).where(relationship between user and friend)
end

第二个条件取决于你的模型。