轨道条件随机循环

时间:2011-09-04 06:57:26

标签: ruby-on-rails ruby-on-rails-3 random controller logic

我有一个名为“浏览”的功能,允许用户浏览随机配置文件。当用户点击“浏览”时,他们会立即转到他们不是朋友的用户个人资料。我的控制器应该是什么样的?

现在我有:

  def browse
    @users = User.all.offset(rand(current_user.matches.count))
    @users.each do |user|
      if !current_user.friends.include?(user)
        @user = user
        return
      end
    end
  end

然而,这似乎不起作用。有什么建议?我肯定对块很糟糕,似乎!

2 个答案:

答案 0 :(得分:2)

你可以试试这样的事情

def browse
   @user = (User.all - current_user.friends).sample
end

更好的版本是

def browse
   @user = User.where('id not in (?)', current_user.friends.map(&:id))
           .offset(rand(current_user.matches.count)).limit(1)
end

此外,如果您过于关注性能,而不是使用偏移技术,最好使用randumb gem来获取随机记录。它使用特定于数据库的函数来选择随机记录(如果可用)。

答案 1 :(得分:1)

为您的用户添加一个额外的方法,如下所示:

def random_stranger
    self.class.where(%Q{
        id not in (
            select friend_id
            from friends
            where user_id = ?
    }, self.id).
    order('random()').
    limit(1).
    first
end

然后在你的控制器中:

def browse
    @user = current_user.random_stranger
end

如果您的数据库不知道如何优化not in,那么您可以将LEFT OUTER JOIN替换为WHERE friend_id is null