Programing

Rails 5 : ActiveRecord 또는 쿼리

lottogame 2020. 8. 14. 08:12
반응형

Rails 5 : ActiveRecord 또는 쿼리


Rails 5 ActiveRecord or에서 쿼리를 어떻게 수행 합니까? 또한, 체인 수 액티브 쿼리에?orwhere


체인에있는 기능 or과 함께 절 where에서 절 ActiveRecord쿼리에서 사용할 수 레일 (5) . 관련 토론 및 pull 요청을 참조하십시오 .

따라서 Rails 5 에서 다음 작업을 수행 할 수 있습니다 .

를 얻으려면 post함께 id1 또는 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)

Rails 5가이 OR쿼리 를 사용할 때까지 기다릴 필요가 없습니다 . 우리는 rails 4.2.3. 여기에 백 포트가 있습니다 .

gem where-or에 대해 Eric-Guo 에게 감사합니다 . 이제이 gem을 사용하여이 기능을 추가 할 수 있습니다 .OR>= rails 4.2.3


(KM Rakibul Islam의 답변에 추가됩니다.)

범위를 사용하면 코드가 더 예뻐질 수 있습니다 (눈에 따라 달라짐).

scope a,      -> { where(a) }
scope b,      -> { where(b) }

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

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

그러나 Rails 5.1.4의 현재 상태에서 이것은 Arel 또는 체인으로 달성하기에는 너무 복잡합니다. 하지만 여전히 Rails를 사용하여 가능한 한 많은 쿼리를 생성하고 싶었습니다.

그래서 나는 작은 해킹을 만들었습니다.

내 모델에서 다음과 같은 개인 메서드를 만들었습니다 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 '))
}

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

이제 잘못된 OR없이 이것을 다른 범위 등과 쉽게 결합 할 수 있습니다.

: 아름다움은 내 sql_where 정상 절 인수를 소요되고 sql_where(name: 'John', role: 'admin')생성합니다 (name = 'John' AND role = 'admin').


레일 5에 대한 능력이 or와 절을 where. 예를 들어.

User.where(name: "abc").or(User.where(name: "abcd"))

참고 URL : https://stackoverflow.com/questions/32753168/rails-5-activerecord-or-query

반응형