6

我该如何正确地写这个?

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

如果我也可以将这些条件放入模型中以用于其他控制器/视图,那就太好了,因为我将在整个应用程序中经常使用这些条件。

4

3 回答 3

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。

于 2013-10-28T15:13:40.367 回答
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

如果您希望能够重用查询的各个片段并根据需要组合它们,请参阅此相关答案(注意,链接到的答案比接受的答案更好,IMO)。

于 2013-10-29T01:56:21.447 回答
1

出色地

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

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

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

我希望它会给你带来想要的结果。

于 2013-10-28T15:27:10.227 回答