2013-04-14 80 views
2

所以我有一個Rails應用程序,它有三種基本型號:EntryUserVote。我需要一個輔助方法,它會給我一個隨機職位用戶投票:在Rails中獲得一個隨機的,未登錄的帖子

def next_entry 
    Entry.where(:receiving_challenge_id => current_voting_challenge.id).offset(rand(Entry.where(receiving_challenge_id: current_voting_challenge.id).count)).first 
end 

這個工作,它會每次都搶隨機職位。

投票屬於用戶和條目,它們通過數據庫中的ID關聯。

但我不想給用戶一個他們投票的帖子。

我該如何做到這一點?

回答

1

- 獲得所有的ID的條目的

- 獲得所有的ID用戶在其上投

-Substract從第一個

第二個-Take任何數量從條目的使用sample方法排列數組,並使用該ID從DB中取出條目:

Entry.find((Entry.all.collect(&:id) - current_user.votes.collect(&:entry_id)).sample) 
+1

是不是樣本被認爲是非常糟糕的Rails練習? – alt

+1

是的,但在這裏您實際上是從一個ID數組中取樣而不是從一個ActiveRecord :: Relation對象中取樣!無論哪種方式,在你的例子中,你將不得不使用樣本方法,因爲你不知道所有條目中的所有ID,它不像在一些例子中,你可以選擇10以下的任何數字,並採用ID ,你必須檢索所有的id - >必須檢索所有的記錄。 – Zippie

0

首先,獲取他們已投票的條目。 然後獲取所有不同的條目

voted_entries = user.votes.includes(:entry).collect(&:entry) 
unvoted_entries = Entry.where('id NOT IN (?)', voted_entries.collect(&:id)) 

然後就可以調用sampleunvoted_entries得到一個隨機。

+0

如果用戶尚未對任何條目投票,則這不起作用。 http://stackoverflow.com/questions/4307411/how-to-express-a-not-in-query-with-activerecord-rails [第二回答,意見] – Zippie

+0

不知道,這是一個恥辱。 – Intrepidd