我有一个名为“浏览”的功能,允许用户浏览随机配置文件。当用户点击“浏览”时,他们会立即转到他们不是朋友的用户个人资料。我的控制器应该是什么样的?
现在我有:
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
然而,这似乎不起作用。有什么建议?我肯定对块很糟糕,似乎!
答案 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
。