Rails 4语法 - 多个条件

时间:2013-10-28 15:06:16

标签: ruby-on-rails

我该如何正确地写这个?

Request.pending.where(.....)  ## Request.pending = request.state_id in (1..3)

这些是条件:

approver1_id = current_user and state_id = 1
or
approver2_id = current_user and state_id = 2
or
approver3_id = current_user and state_id = 3

如果我可以将这些条件放在模型中以便在其他控制器/视图中使用,那将是非常好的,因为我将在整个应用程序中经常使用这些条件。

3 个答案:

答案 0 :(得分:11)

尝试:

Request.pending.where(
  '(approver1_id= ? AND state_id= ?) OR
   (approver2_id= ? AND state_id= ?) OR
   (approver3_id= ? AND state_id= ?)',
  current_user.id,
  1,
  current_user.id,
  2,
  current_user.id,
  3
)

编辑: 我忘了你应该用冒号。不应该是'current_user.id'吗?还不清楚您的请求是否使用三个参数approver1_id - approver3_id或每个请求只使用一个approver_id。

编辑2: 将查询更改为SQL。

答案 1 :(得分:8)

要回答有关重用此查询的问题的第二部分,您只需在Request上定义一个接受用户参数的类方法:

# usage: Request.pending_approval(current_user)
def self.pending_approval(user)
  pending.where("(approver1_id = :user AND state_id = 1) OR 
                 (approver2_id = :user AND state_id = 2) OR 
                 (approver3_id = :user AND state_id = 3)", 
                user: user)
end

如果您希望能够重复使用查询的各个片段并根据需要将它们组合在一起,请参阅this related answer(注意,链接的答案优于已接受的答案,IMO)。

答案 2 :(得分:1)

好吧

首先获取所有state_id&将它存储在数组中。然后在where子句中传递该数组。它类似于Mysql IN 查询。

因此,您的查询将类似于:

state_id = [1, 2, 3]  
Request.pending.where(:state_id => state_id AND :approved_id => current_user.id)

我希望它会取得你想要的结果。