【问题标题】:mongoid scope find the wrong conversationmongoid 范围找到错误的对话
【发布时间】:2015-06-27 09:57:20
【问题描述】:

我的模型有以下作用域:

scope :between, -> (sender_id,recipient_id) do
    where(sender_id: sender_id, recipient_id: recipient_id).or(sender_id: recipient_id, recipient_id: sender_id).exists?
  end

这试图找到两个人之间的对话,在我的控制器上我有以下操作:

def create
    if Conversation.between(params[:sender_id],params[:recipient_id]).exists?
      @conversation = Conversation.between(params[:sender_id],params[:recipient_id]).first
      redirect_to dashboard_conversation_path(@conversation.id)
    else
      @conversation = Conversation.create!(conversation_params)
      redirect_to dashboard_conversation_path(@conversation.id)
    end
  end

这是我的问题:

我还有 3 个以上的用户:

用户、A、B、C、D...没有任何人之间的对话。我创建了用户A和用户B之间的对话。对话不存在,所以创建,然后如果用户A想与用户C开始对话,模型返回false,因为对话不存在,儿子我的控制器需要创建一个新的,但是,控制器打开了用户 A 和用户 B 之间的对话,但它必须在用户 A 和用户 C 之间创建一个新的对话,并打开这个对话。

我做错了什么??我尝试了不同的浏览器并清理了我的缓存。


更新:

创建第一个对话后,它总是显示第一个对话。我的意思是:

第一次对话

  • 用户 A - 用户 B

尝试在以下用户之间创建其他对话:

  • 用户 A - 用户 C,显示对话用户 A、B
  • 用户 C - 用户 B,显示对话用户 A、B
  • 用户 C - 用户 D,显示对话用户 A、B

【问题讨论】:

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


    【解决方案1】:

    or 方法并不像您认为的那样工作。如果您查看底层选择器:

    Conversation.where(sender_id: s, recipient_id: r).or(sender_id: r, recipient_id: s).selector
    

    你会看到这个:

    {
      "sender_id" => s,
      "recipient_id" => r,
      "$or" => [
        {
          "sender_id" => r,
          "recipient_id" => s,
        }
      ]
    }
    

    在查询中调用 or 并不意味着“查询中已经存在的任何内容这个额外的条件”,它只是意味着“以及这些条件中的任何一个”。

    你想要的选择器是:

    {
      "$or" => [
        { "sender_id" => s, "recipient_id" => r },
        { "sender_id" => r, "recipient_id" => s }
      ]
    }
    

    这将通过一个 or 调用构建:

    or([
      { sender_id: s, recipient_id: r },
      { sender_id: r, recipient_id: s }
    ])
    

    您的scope 中的尾随exists? 调用实际上并不存在。如果是这样,那么您就是在滥用 scope 创建一个普通的旧类方法并说 def self.between(sender_id, recipient_id) 会是一个更好的主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2021-12-06
      相关资源
      最近更新 更多