2009-07-30 69 views
2

如何在使用group时获得随机记录?Rails,使用时获取随机记录:组

@paintings = Painting.all(:group => "user_id", :order => "created_at DESC") 

这给了我最新的绘画为每个用户。现在我想从每个用户中选择一张随机的绘画,而不是最新的。绘画的顺序应该是相同的,以便最活跃的用户首先显示他/她的随机绘画。

painting150(用户1)
painting200(用户2)
painting231(用户3)

这可能吗?

此致敬礼。 AsbjørnMorell。

回答

1

这个答案是特定于Rails的,但是因为你使用的是ActiveRecord,所以我是一个假装它应该没问题。

unique_paintings = [] 
@paintings.group_by(&:user_id).each do |user_id, paintings| 
    unique_paintings << paintings[rand(paintings.size-1)] 
end 

unique_paintings.sort_by(&:created_at) 

的GROUP_BY肯定打乱了你在查询做了created_at排序,所以我做了sort_by作为最后一步。您可能希望在查询中摆脱它,因为您无论如何都必须在此处执行此操作。

0
@painting = @paintings[rand(@paintings.size-1)] 

(或paintings.count,不知道的还正确的方法)

+0

我应该在我看来用这个吗? – atmorell 2009-07-30 13:04:12

+2

此示例仅返回一个随机图像...即使@paintings包含100条记录。 – atmorell 2009-07-30 13:05:29

0

假设你有MySQL,你可以尝试:

@paintings = Painting.all(:group => "user_id", :order => "RAND()") 
+0

这总是为每个用户返回相同的记录,但以随机顺序:/我需要为每个用户返回一张随机的绘画。 – atmorell 2009-07-30 14:03:16

0

你可以做这样的事情,但它会遭受随着你的记录数增长

@paintings = Painting.find(:all, :order => 'RAND()').map{ |i| i.user_id }.uniq