2014-02-20 67 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