为什么我因为范围而不断收到WhereChain查询?

时间:2014-05-20 19:53:30

标签: ruby-on-rails ruby ruby-on-rails-4

所以我试图创建一个带有两个变量的作用域,(current_user,other_user),并根据sender_id和receiver_id(我的foreign_keys)分隔两者之间的消息。

我之前在项目中使用了以下内容,并且效果很好:

scope :between, -> (me, other) { Message.where{((:sender_id == my{me.id}) & (:receiver_id     == my{other.id})) | ((:sender_id == my{other.id}) & (:receiver_id == my{me.id}))}}

然而,在我目前的项目中,我使用相同的东西,它做了两件事。

1:绑定后,它会提供此响应。

[1] pry(#<ConversationsController>)> @messages
   Message Load (0.4ms)  SELECT "messages".* FROM "messages"
 => #<ActiveRecord::QueryMethods::WhereChain:0x00000106d83c98
   @scope=
   [#<Message id: 1, title: nil, body: "Message 1", sender_id: 11,        receiver_id: 1, created_at: "2014-05-20 19:29:34", updated_at: "2014-05-20 19:29:34">,
    #<Message id: 2, title: nil, body: "Message 2", sender_id: 1, receiver_id: 11, created_at: "2014-05-20 19:30:15", updated_at: "2014-05-20 19:30:15">,
    #<Message id: 3, title: nil, body: "radda?", sender_id: 1, receiver_id: 109, created_at: "2014-05-20 19:30:39", updated_at: "2014-05-20 19:30:39">]>

正如您在上面所看到的,它将所有用户ID组合在一起,而不仅仅是发送方和接收方。所以所有用户都收到所有消息。然后,我一直得到这个WhereChain错误。

#<ActiveRecord::QueryMethods::WhereChain:0x00000107f99ea0>

请帮助我理解我可能做错了什么,或者我能做些什么。谢谢。

2 个答案:

答案 0 :(得分:1)

尝试:

scope :between, -> (me, other) { where(['(sender_id = :me and receiver_id = :other) or (sender_id = :other and receiver_id = :me)', {me: me.id, other: other.id}])}

答案 1 :(得分:0)

您当前项目中没有安装squeel gem,并且您使用的语法需要它。在Rails 3中,您会收到错误wrong number of arguments 0 for 1,但在第4栏中,您可以在没有任何参数的情况下拨打where(因此您可以拨打not)。您传递的块已被忽略,并返回WhereChain对象。

请注意,squeel不再维护。小心使用。