[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 쿼리 .