如何选择具有不同用户的随机行(ActiveRecord)

时间:2014-02-15 14:26:51

标签: ruby-on-rails ruby activerecord

我在选择两张不同用户的随机照片时遇到了麻烦......如果你能帮助我,那将是非常棒的。)

所以,让我说我自己的user_id = 1。我们也不需要那样。

表格看起来像这样:

|----------------------------|
| id | user_id | url | score |
|----------------------------|
| 1  | 1       | A   | 15    |
| 2  | 1       | B   | 5     |
| 3  | 2       | C   | 1     |
| 4  | 2       | D   | 51    |
| 5  | 2       | E   | 2     |
| 6  | 2       | F   | 9     |
| 7  | 3       | G   | 7     |
| 8  | 3       | H   | 3     |
| 9  | 3       | I   | 88    |
| 10 | 4       | J   | 15    |
| 11 | 4       | K   | 0     |
| .. | ...     | ..  | ...   |
|----------------------------|

因为我是用户1,所以我不必获取user_id = 1的行。

我需要另外两个用户的两个随机行。而那些行也不能是同一个用户。简而言之 - 不是我而不是其他2个相同的用户。

E.g。

| 5  | 2       | E   | 2     |
| 8  | 3       | H   | 3     |
or
| 8  | 3       | H   | 3     |
| 11 | 4       | K   | 0     |
or
| 10 | 4       | J   | 15    |
| 3  | 2       | C   | 1     |

SQL查询就可以了。但是,如果你能在Ruby on Rails ActiveRecord结构中提供它,那就太酷了。

编辑:

我尝试过:

@photos = Photo.order('RANDOM()').where.not(:user_id => current_user.id).limit(2).uniq(:user_id)

@photos = Photo.order('RANDOM()').where.not(:user_id => current_user.id).limit(2).distinct(:user_id)

@photos = Photo.distinct(:user_id).random(2)

@photos = Photo.uniq(:user_id).random(2)

P.S。 random()来自gem“randumb”。我认为没有什么大的影响。

编辑2:

这有效

@photos = []
@photo1 = Photo.order('RANDOM()').where.not(:user_id => current_user.id).first
@photo2 = Photo.order('RANDOM()').where.not(:user_id => current_user.id, :user_id => @photo1.user_id).first
@photos << @photo1 << @photo2

1 个答案:

答案 0 :(得分:1)

首先,这将为您提供给定用户的随机图片

Photo.where("user_id = ?",<USER_ID>).shuffle.first

现在您需要2个不同的用户,这些用户不是当前用户

Photo.select("distinct user_id").where("user_id <> ?",<CURRENT_USER>).shuffle.first(2)

现在一举一动

@photos = []
unique_user_cnt = 2
Photo.select("distinct user_id").where("user_id <> ?",<CURRENT_USER>).shuffle.first(unique_user_cnt).each do |p|
  @photos << Photo.where("user_id = ?",p.user_id).shuffle.first
end