복붙노트

[RUBY-ON-RAILS] 5 레일 : 액티브 OR 쿼리

RUBY-ON-RAILS

5 레일 : 액티브 OR 쿼리

어떻게 5 액티브 레일에서 또는 쿼리를해야합니까? 또한, 체인 또는 여기서 액티브 쿼리에 함께 가능한가?

해결법

  1. ==============================

    1.액티브 쿼리 절은 관련 토론과 풀 요청을 참조하십시오 5. 레일에서 사용할 수 곳과 함께 체인 또는 절 할 수있는 능력.

    액티브 쿼리 절은 관련 토론과 풀 요청을 참조하십시오 5. 레일에서 사용할 수 곳과 함께 체인 또는 절 할 수있는 능력.

    그래서, 당신은 레일 (5)에 다음의 일을 할 수있을 것입니다 :

    ID 1 또는 2로 게시물을 얻으려면 :

    Post.where('id = 1').or(Post.where('id = 2'))
    

    몇 가지 다른 예 :

    (A && B) || 씨:

        Post.where(a).where(b).or(Post.where(c))
    

    (A || B) && C :

        Post.where(a).or(Post.where(b)).where(c)
    
  2. ==============================

    2.우리는이 OR 쿼리를 사용하는 레일 5 기다릴 필요가 없습니다. 우리는 또한 레일 4.2.3와 함께 사용 할 수 있습니다. 여기에 백 포트가있다.

    우리는이 OR 쿼리를 사용하는 레일 5 기다릴 필요가 없습니다. 우리는 또한 레일 4.2.3와 함께 사용 할 수 있습니다. 여기에 백 포트가있다.

    보석 경우 또는, 이제 우리는> = 4.2.3은이 보석을 사용하여 레일이 OR 기능을 추가 할 수 있습니다 에릭 - 구오에 감사드립니다.

  3. ==============================

    3.(K M Rakibul 이슬람에 의해 대답에 그냥 추가.)

    (K M Rakibul 이슬람에 의해 대답에 그냥 추가.)

    범위를 사용하여 코드 (보는 눈)에 따라 더 예뻐 될 수 있습니다 :

    scope a,      -> { where(a) }
    scope b,      -> { where(b) }
    
    scope a_or_b, -> { a.or(b) }
    
  4. ==============================

    4.나는 (A && B)를 할 필요가 || (C && D) || (E && F)

    나는 (A && B)를 할 필요가 || (C && D) || (E && F)

    그러나 레일 5.1.4의 현재 상태에서이 GET 너무 Arel 또는 체인으로 달성하기 위해 복잡. 하지만 난 여전히 가능한 쿼리 많이 생성 레일을 사용하고 싶었다.

    그래서 나는 작은 해킹을했다 :

    내 모델에서 나는 개인 방법이라고 sql_where을 만들어 :

    private
      def self.sql_where(*args)
        sql = self.unscoped.where(*args).to_sql
        match = sql.match(/WHERE\s(.*)$/)
        "(#{match[1]})"
      end
    

    다음 내 범위에서 나는 OR의를 개최 배열을 생성

    scope :whatever, -> {
      ors = []
    
      ors << sql_where(A, B)
      ors << sql_where(C, D)
      ors << sql_where(E, F)
    
      # Now just combine the stumps:
      where(ors.join(' OR '))
    }
    

    어떤 예상 쿼리 결과를 생성합니다 : `models` WHERE ((A 및 B) 또는 (C AND D) 또는 (E 및 F)) FROM SELECT *.

    그리고 지금은 쉽게 불법 OR의없이 등 범위간에이 결합 할 수 있습니다.

    아름다움은 내 sql_where 정상 절 인수를 소요되는 : sql_where (이름 : '존'역할 '관리자')은 (이름 = '존'과 역할 = '관리자')를 생성합니다.

  5. ==============================

    5.레일 5에 대한 능력이나 절을 가지고있다. 예를 들어.

    레일 5에 대한 능력이나 절을 가지고있다. 예를 들어.

    User.where(name: "abc").or(User.where(name: "abcd"))
    
  6. from https://stackoverflow.com/questions/32753168/rails-5-activerecord-or-query by cc-by-sa and MIT license