2014-02-20 114 views
1

我有5個模型:用戶,關鍵字,問題,關聯和question_status。左或全加入活動記錄

  • 用戶和關鍵字由協會(同樣的關鍵字可以由多個用戶 添加&反之亦然)
  • 關鍵字和問題通過的has_many belongs_to的(關鍵字 可以有很多問題,問題涉及有關屬於關鍵字)
  • 用戶和問題由question_status(用戶可以標記 問題的回答,刪除等)

所以RELA相關tionships是:

  1. 用戶有通過協會的關鍵字
  2. 關鍵字有通過協會衆多用戶
  3. 關鍵字,有許多問題
  4. 問題屬於一個關鍵字
  5. 的用戶可以將狀態許多問題通過question_status
  6. 一個問題可以由許多用戶通過分配status_status

我不得不建造5個模型,因爲同一個關鍵字可以被多個用戶添加。所以我必須保持用戶和關鍵字彼此分離,並通過關聯使它們相關。同樣,多個用戶可以在同一個問題上擁有不同的標籤(回答,刪除,存檔等)。所以我必須將這些狀態與問題表分開保存。

模型是 -

class User < ActiveRecord::Base 
    has_many :associations, dependent: :destroy 
    has_many :keywords, :through => :associations 

    has_many :question_statuses, dependent: :destroy 
    has_many :questions, :through => :question_statuses 

class Keyword < ActiveRecord::Base 
    has_many :questions, dependent: :destroy 

    has_many :associations, dependent: :destroy 
    has_many :users, :through => :associations 

class Question < ActiveRecord::Base 
    belongs_to :keyword 

    has_many :question_statuses, dependent: :destroy 
    has_many :users, :through => :question_statuses 

class Association < ActiveRecord::Base 
    belongs_to :keyword 
    belongs_to :user 

class QuestionStatus < ActiveRecord::Base 
    belongs_to :question 
    belongs_to :user 

我需要建立在ActiveRecord的連接查詢,這將使我的問題的用戶(例如users.id = 2)關鍵字用戶在自己的帳戶添加排除已刪除或回答的問題,例如已刪除= t或回答= t在question_statuses表中。

只有當用戶標記問題時,記錄纔會添加到question_statuses中。否則,question_statuses將沒有該用戶的任何記錄。

任何幫助將不勝感激。

+0

你提到了刪除= t和回答= t。那些在Rails中的布爾字段?如果您使用顯式文本字段而不是布爾字段,我建議切換到使用布爾字段,以便Rails能夠理解您打算在其中存儲什麼類型的信息。 – Coenwulf

+0

他們是布爾字段。 – amey1908

回答

0

2接近

1.使用表名

Question.join(question_statuses: :users).where('users.id = 2').where('question_statuses.deleted is true').where('question_statuses.answered is true') 

2。使用AREL

的加入將是與上面相同,但where子句會稍有不同,你可能需要在腳本玩弄/控制檯

+0

感謝您的及時回覆。在上面的答案中,你的意思是question_statuses.deleted是錯誤的,因爲我需要排除它們。類似的回答。對? – amey1908

+0

You are correct,typo = P – jamesy829

+0

@ user2376032 - 我認爲這是行不通的,除非我做一個左連接,因爲question_statuses只有那些被用戶標記爲刪除或回答的記錄。如果用戶還沒有標記任何問題,上面的查詢將返回零記錄,因爲它使用question_statuses進行INNER JOIN。任何想法如何做一個LEFT JOIN? – amey1908

0

編輯:答案換下基於從OP反饋

這裏的ActiveRecord的語法,我覺得應該這樣做:

Question.joins("LEFT OUTER JOIN question_statuses ON question.id = question_statuses.question_id AND question_statuses.user_id = #{ActiveRecord::Base.connection.quote(user_id)}").where(question_statuses: {user_id: nil}) 

這相當於在SQL:

SELECT * from questions LEFT OUTER JOIN question_statuses ON question.id = question_statuses.question_id AND question_statuses.user_id = 2 WHERE question_statuses.user_id IS NULL; 
+0

這會創建一個內部連接,但我認爲我需要一個左連接或完全連接,因爲question_statuses沒有任何用戶記錄,除非該用戶將問題標記爲已回答或已刪除。根據問題表中列出的關鍵字,向用戶顯示問題。我如何在答案中進行左連接? – amey1908

+0

如果我正確理解你的評論,你想要的是所有用戶沒有設置任何狀態的問題? – Coenwulf

+0

你是對的,但你的回答假設question_statuses包含所有問題,而不管用戶是否標記它。如果是這種情況,那麼你的解決方案將起作用。您的解決方案導致以下「SELECT」問題。* FROM「questions」INNER JOIN「question_statuses」ON「questions」。「id」=「question_statuses」。「question_id」WHERE「question_statuses」。「user_id」= 2' Questions與question_statuses形成一個內部連接,但如果用戶沒有標記任何問題,question_statuses將不會有任何內容。問題從問題表中顯示給用戶。 – amey1908