mongoid 4范围

时间:2015-06-12 07:44:53

标签: ruby-on-rails mongoid

我尝试创建以下范围:

scope :involving, -> (user) do
    where("conversations.sender_id =? OR conversations.recipient_id =?", user.id, user.id)
  end

但我明白了:

  

错误的参数数量(3对1)

我做错了什么。

提前致谢。

1 个答案:

答案 0 :(得分:0)

Mongoid的where并不了解像a = ? OR b = ?这样的SQL代码段,它只需要一个哈希参数。因此你的" 3为1"错误。

您希望使用any_of来构建:$or查询:

any_of(
  { :sender_id    => user.id },
  { :recipient_id => user.id }
)

请注意多个any_of组合在一起,所以:

M.any_of(a, b).any_of(c, d)

说:

a OR b OR c OR d # any_of(a, b, c, d)

而不是

(a OR b) AND (c OR d)

正如您所料。

如果您期望每个组合OR条件,那么您可能希望将sender_idrecipient_id合并到一个数组字段中:

field :involved_ids, :type => Array

这样你就可以说:

where(:involved_ids => user.id)

并避免OR问题。您当然还有单独的sender_idrecipient_id字段,您只需复制数据以更好地适应您的查询。对MongoDB来说,非常规化您的数据以适合您的查询。