【问题标题】:rails where for checking multiple condition用于检查多个条件的导轨
【发布时间】:2014-09-11 10:21:24
【问题描述】:

是否有任何捷径可以在 Rails 中纠正以下查询:

Message.where("(user_id = 8 AND  commentable_id= 84) OR (user_id=84 AND commentable_id=8) ")

谢谢

【问题讨论】:

    标签: mysql ruby-on-rails activerecord active-relation


    【解决方案1】:

    我认为这应该可行:

    arr = [8, 84] Message.where(user_id: arr, commentable_id: arr)

    以上查询将有 4 种组合:

          user_id      commentable_id

    1. 8              8
    2. 8              84
    3. 84            8
    4. 84            84

    以上组合中,第 1 和第 4 种无效。因此它应该会给你带来结果。

    【讨论】:

    • 酷:)。顺便说一句,它的varunvlalan:D
    【解决方案2】:

    也许 Arel 是您正在寻找的可读性,例如:

    class Message < ActiveRecord::Base
      def self.user_id_and_comment_id user_id, comment_id
        where user_and_comment(user_id, comment_id).or(user_and_comment comment_id, user_id)
      end
      private
      def self.user_and_comment user_id, comment_id
        table[:user_id].eq(user_id).and(table[:commentable_id].eq comment_id)
      end
    
      def self.table
        self.arel_table
      end
    end
    
    Message.user_id_and_comment_id 8, 84
    

    将内容提取到单独的模型和范围中有助于组合查询,并使它们可重用于其他相关查询。 顺便提一句。我假设您没有将 ID 硬编码到 SQL 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多