Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道4-与AND条款连接_Ruby On Rails_Postgresql_Join - Fatal编程技术网

Ruby on rails 轨道4-与AND条款连接

Ruby on rails 轨道4-与AND条款连接,ruby-on-rails,postgresql,join,Ruby On Rails,Postgresql,Join,下面的查询根据该问题的状态为我获取用户的下一个问题。它获取该特定部分的所有问题,然后作用域对属于该用户的状态进行左连接 我的问题是,这似乎不是一种很有讽刺意味的方式——有没有更好的方式来过滤我的桌子,而不是这种笨拙的方式。我的问题是,很明显,如果任何用户回答了这个问题,那么左连接将填充该用户的答案,而我要求它为null 从本质上说,这个查询是有效的,但很难看,我不知道这是否是最有效的方法 scope :next_for_user, lambda { |user| joins("LEFT

下面的查询根据该问题的状态为我获取用户的下一个问题。它获取该特定部分的所有问题,然后作用域对属于该用户的状态进行左连接

我的问题是,这似乎不是一种很有讽刺意味的方式——有没有更好的方式来过滤我的桌子,而不是这种笨拙的方式。我的问题是,很明显,如果任何用户回答了这个问题,那么左连接将填充该用户的答案,而我要求它为null

从本质上说,这个查询是有效的,但很难看,我不知道这是否是最有效的方法

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-我已经更新了答案。希望这个解释有意义!