我有5个模型:用户,关键字,问题,关联和question_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中创建一个JOIN查询,该查询会为用户提供问题(例如users.id = 2),以便用户在其帐户中添加的关键字排除已删除或回答的问题,例如在question_statuses表中删除= t或回答= t。
仅当用户标记问题时,才会将记录添加到question_statuses。否则,question_statuses将没有该用户的任何记录。
任何帮助都将受到高度赞赏。
答案 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;