左侧或全部加入活动记录

时间:2014-02-20 23:55:50

标签: ruby-on-rails activerecord join associations

我有5个模型:用户,关键字,问题,关联和question_status。

  • 用户和关键字通过关联相关(相同的关键字可以是 由多个用户添加&反之亦然)
  • 关键字和问题由has_many belongs_to(关键字)相关 可以有很多问题而且问题属于关键字)
  • 用户和问题由question_status相关(用户可以标记 回答,删除等问题。)

所以关系是:

  1. 用户通过关联有很多关键字
  2. 关键字通过关联包含许多用户
  3. 关键字有很多问题
  4. 问题属于关键字
  5. 用户可以通过question_status
  6. 在许多问题上输入状态
  7. 许多用户可以通过question_status
  8. 为问题分配状态

    我必须构建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中创建一个JOIN查询,该查询会为用户提供问题(例如users.id = 2),以便用户在其帐户中添加的关键字排除已删除或回答的问题,例如在question_statuses表中删除= t或回答= t。

    仅当用户标记问题时,才会将记录添加到question_statuses。否则,question_statuses将没有该用户的任何记录。

    任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分: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子句略有不同,你可能需要在脚本/控制台中玩耍

答案 1 :(得分: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;