2015-01-07 21 views
1

我从列表中获得5个样品(随机量),使用:如何得到。样品,如果样品存在,那么再弄

list = List.all.sample(5) 
list.each do |list| 
list.statuses.create(:user_id => @user.id) 
end 
在我的状态模型

我:

validates :list_id, uniqueness: { scope: :user_id } 

验证list_id对用户是唯一的。 但是,它会给出5个样本,如果其中一个出现在状态中,它不会保存。

我想完成的事情是,它会发现一个新的列表,所以我总是以5个样本结束,而不是说3-4,因为它有2个随机重复。

+0

'List.all.sample(5)':您调用方法'.sample'的数组,其中包含所有列表阵列您的数据库记录。你可能想在数据库中随机选取5条List记录,而不是全部抓取它们,然后随机选择其中的5条记录。 (性能提升) – MrYoshiji

+0

@MrYoshiji我不知道你是怎么做到的,你能不能告诉我。我很乐意学习它 – sja

+0

当然,我将需要您的数据库系统的名称(MySQL?PostgreSQL?每个数据库系统都有其自己的随机函数)。另外,我不完全了解你的问题,你能添加更多关于你们关系的信息吗? (我猜列表'has_many:状态',但用户呢?) – MrYoshiji

回答

1

我想要做的是记录哪些列表id为特定用户发送,以便当他们再次执行时不会发送相同的列表ID。但是,一个新的随机5.

这应做到:

specific_user = User.find(params[:id]) 
lists = List.order('random()') # This random() is a PostgreSQL function! 
lists = lists.where('id NOT IN (?)', specific_user.lists.pluck(:id).presence || -1) # exclude the list of the specific_user 
lists = lists.limit(5) # limit to only 5 records 
lists.each do |list| 
list.statuses.create(:user_id => specific_user.id) 
end 
+0

我遇到的唯一问题是,我需要检查list_id是否不存在于表中,名为 状态。状态如下所示: user_id | list_id 并添加用户标识和他们发布的列表。如果我写current_user.statuses.pluck(:id)它会看看current_user id它不会,而不是list_id? – sja

+0

您可以摘取状态记录的'list_id'属性。 ('current_user.statuses.pluck(:list_id)') – MrYoshiji

+0

是的,我想,并给你正确的答案。谢谢你真棒:) – sja

0

首先筛选出重复项,然后从余项中抽样。因此,如果Userhas_many :lists你可以这样做:

(List.all - @user.lists).sample(5) 

has_many可能是through :statuses