2015-01-07 38 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