Ruby on rails 轨道4-与AND条款连接
下面的查询根据该问题的状态为我获取用户的下一个问题。它获取该特定部分的所有问题,然后作用域对属于该用户的状态进行左连接 我的问题是,这似乎不是一种很有讽刺意味的方式——有没有更好的方式来过滤我的桌子,而不是这种笨拙的方式。我的问题是,很明显,如果任何用户回答了这个问题,那么左连接将填充该用户的答案,而我要求它为null 从本质上说,这个查询是有效的,但很难看,我不知道这是否是最有效的方法Ruby on rails 轨道4-与AND条款连接,ruby-on-rails,postgresql,join,Ruby On Rails,Postgresql,Join,下面的查询根据该问题的状态为我获取用户的下一个问题。它获取该特定部分的所有问题,然后作用域对属于该用户的状态进行左连接 我的问题是,这似乎不是一种很有讽刺意味的方式——有没有更好的方式来过滤我的桌子,而不是这种笨拙的方式。我的问题是,很明显,如果任何用户回答了这个问题,那么左连接将填充该用户的答案,而我要求它为null 从本质上说,这个查询是有效的,但很难看,我不知道这是否是最有效的方法 scope :next_for_user, lambda { |user| joins("LEFT
scope :next_for_user, lambda { |user|
joins("LEFT JOIN user_question_statuses ON user_question_statuses.question_id = questions.id AND user_question_statuses.user_id = ", user.id.to_s).
reorder("user_question_statuses.answered ASC NULLS FIRST").
order("user_question_statuses.updated_at ASC NULLS FIRST").
limit(1)
}
编辑:
我意识到这种方法特别容易受到SQL注入的影响,因此我将查询中的主线替换为:
joins(sanitize_sql_array(["LEFT JOIN user_question_statuses ON user_question_statuses.question_id = questions.id AND user_question_statuses.user_id = %d", user.id]))
这似乎有效,并强制输入仅为整数
编辑2:
我的另一个选项是使用find\u each然后user first\u或\u create为当前用户的特定问题部分创建空问题状态。当他们在寻找问题之前需要他们时,这可能会发生。这将使我能够正确地将问题连接到这些状态,知道它们的存在,但如果第一种方法是高效、安全的,并且尽可能的轻率,那么就没有理由改变这一点
编辑3:
我以这种方式构造了这个查询,因为从有许多问题的节模型中,我想找到应该传递给用户的下一个问题
要找到这一点,我需要将所有用户的问题状态加入到所有部门模型的问题中。唯一可以做到这一点的方法是使用question.id。但是,对于不同的用户,有许多具有该问题id的用户\u问题\u状态。因此,当加入时,我需要AND子句在加入之前将用户的状态过滤到该用户的状态。一个用户显然每个问题只有一个状态
我使用左连接,这样,如果状态不存在,则只有在用户第一次尝试提问后,才会创建状态。仍然存在到处都是空值的状态,以便创建一行,然后从该行移动到顶部,因此首先为空值,并可能为用户提供服务器
这一切可能都非常不清楚 您所做的是跳过Active Record提供的ORM层,自己构造查询。您的感觉是正确的,这种方法有很多局限性,不适合rails所遵循的MVC模型。我建议大家通读一下,了解一下以rails/oop方式进行操作的概念我熟悉查询界面。但是,没有方法在连接上使用AND子句,这需要我超出AND子句的范围。@muistooshort-我已经更新了答案。希望这个解释有意义!