2014-01-11 67 views
2

我正在從Rails應用程序中爲用戶提供來自用戶所選類別的隨機問題。如果用戶回答了問題,我希望它永遠不會再提供給用戶。使用連接表來排除出現在隨機查詢中的記錄

問題的答案存儲在記憶表中。記憶表充當用戶和問題之間的連接表。在rails控制檯中,我可以使用question = Question.first隔離所有已回答特定問題的用戶,並且question.users將返回已回答該問題的一組用戶對象。

在rails中,我無法弄清楚如何排除已回答的問題再次呈現。

指導?

作爲一個領導者,我進入rails/ruby​​開發大約12周。我懷疑這很容易,我只是看不到它。

我QuestionsController - 這部作品提出一個隨機的問題,但如果它已經由先前用戶回答甚至提出:

class QuestionsController < ApplicationController 

    def index 
    @category = Category.find(params[:category_id]) 
    @question = Question.where(category_id: @category.id).sample 
    end 

    def show 
    @question = Question.find(params[:id]) 
    end 

end 

問題型號

class Question < ActiveRecord::Base 
    validates_presence_of :category_id 

    has_many :memories, 
    inverse_of: :question 

    has_many :users, 
    through: :memories 

    belongs_to :category, 
    inverse_of: :questions 

end 

用戶型號

class User < ActiveRecord::Base 
    validates_presence_of :first_name, :last_name, :role 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    def is_admin? 
    role == 'admin' 
    end 

    has_many :memories, 
    inverse_of: :user, 
    dependent: :destroy 

    has_many :questions, 
    through: :memories 

end 

內存模型

class Memory < ActiveRecord::Base 
    validates_presence_of :user, :question 

    belongs_to :question, 
    inverse_of: :memories 

    belongs_to :user, 
    inverse_of: :memories 

    validates :question, uniqueness: { :scope => :user } 

end 

在我的記憶模型驗證防止用戶回答他們已經回答了一個問題 - 所以這是朝着正確方向邁出的一步。我希望這個問題一旦回答就再也不會出現。

這是我第一篇文章。興奮地加入社區,並希望有一天能夠支付。感謝您的任何指導。

回答

1

您可以嘗試

@question = Question.where(category_id: @category.id) 
    .where("id NOT IN(select question_id from memories where user_id = ?)", current_user.id) 
    .sample 
+0

我會看看,並與上述反應合併這,看看我可以製造正面或反面,並取得成功。感謝您的迴應! – ryanscottbuchholtz

+0

這工作沒有調整。我已經招致了技術債務,並且會在我今晚睡覺之前強迫自己償還。將研究這一點,並確保我理解它。謝謝。 – ryanscottbuchholtz

0

你有兩個相當複雜的問題,你的問題解決了。

首先是記錄正確的隨機化,你可以SO找到很多很好的答案:

而第二個是選擇的數據是一種方式不通過關係排除記錄而關聯。

你可以通過一個子查詢做到這一點:Rails exclusion query with active record -- Rails 3.1

還是通過外部連接:Finding records with no associated records in rails 3

補充說明:

力爭用ActiveRecords關係的所有的時間,所以@category.questions代替Question.where(category_id: @category.id)

如果通過示波器實現隨機化和選擇得當,應該可以寫出簡潔的代碼,如:

@questions = @category.questions.unanswered(current_user.id).random 
+0

謝謝!非常感謝您的指導。看起來我今晚有一些閱讀。當我取得成功時,我會回覆。再次,謝謝。 – ryanscottbuchholtz