[ruby-on-rails] ActiveRecord OR 쿼리

Rails 3 ActiveRecord에서 OR 쿼리를 수행하는 방법 내가 찾은 모든 예제에는 AND 쿼리가 있습니다.

편집 : OR 방법은 Rails 5부터 사용할 수 있습니다. ActiveRecord :: QueryMethods를 참조하십시오.



답변

ARel 사용

t = Post.arel_table

results = Post.where(
  t[:author].eq("Someone").
  or(t[:title].matches("%something%"))
)

결과 SQL :

ree-1.8.7-2010.02 > puts Post.where(t[:author].eq("Someone").or(t[:title].matches("%something%"))).to_sql
SELECT     "posts".* FROM       "posts"  WHERE     (("posts"."author" = 'Someone' OR "posts"."title" LIKE '%something%'))


답변

하나의 열 값에 OR 연산자를 사용하려는 경우 배열을 전달할 수 .where있으며 ActiveRecord는 다음을 사용합니다 IN(value,other_value).

Model.where(:column => ["value", "other_value"]

출력 :

SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column` IN ('value', 'other_value')

이것은 OR단일 열 에서 동등한 것을 달성해야합니다.


답변

Rails 3에서는

Model.where("column = ? or other_column = ?", value, other_value)

이것은 또한 원시 SQL을 포함하지만 ActiveRecord에 OR 연산을 수행하는 방법이 없다고 생각합니다. 귀하의 질문은 멍청한 질문이 아닙니다.


답변

업데이트 된 Rails / ActiveRecord 버전은이 구문을 기본적으로 지원할 수 있습니다. 다음과 유사합니다.

Foo.where(foo: 'bar').or.where(bar: 'bar')

이 풀 요청에 명시된 바와 같이 https://github.com/rails/rails/pull/9052

지금은 단순히 다음을 고수하는 것이 좋습니다.

Foo.where('foo= ? OR bar= ?', 'bar', 'bar')

업데이트 : https://github.com/rails/rails/pull/16052 에 따르면 이 or기능은 Rails 5에서 사용할 수 있습니다

업데이트 : 기능이 Rails 5 지점으로 병합되었습니다


답변

Rails는 최근에 이것을 ActiveRecord에 추가했습니다. Rails 5에서 출시 될 것으로 보인다.

https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89

Post.where(column: 'something').or(Post.where(other: 'else'))

# => SELECT * FROM posts WHERE (column = 'something') OR (other = 'else)


답변

Rails 5에는 or방법 이 제공됩니다 . (l 잉크를 문서로 )

이 메소드는 ActiveRecord::Relation객체를 받아들 입니다. 예 :

User.where(first_name: 'James').or(User.where(last_name: 'Scott'))


답변

배열을 인수로 사용하려면 Rails 4에서 다음 코드가 작동합니다.

query = Order.where(uuid: uuids, id: ids)
Order.where(query.where_values.map(&:to_sql).join(" OR "))
#=> Order Load (0.7ms)  SELECT "orders".* FROM "orders" WHERE ("orders"."uuid" IN ('5459eed8350e1b472bfee48375034103', '21313213jkads', '43ujrefdk2384us') OR "orders"."id" IN (2, 3, 4))

더 자세한 정보 레일 4 인수로 배열과 OR 쿼리 .