Rails 3 ActiveRecord에서 OR 쿼리를 수행하는 방법 내가 찾은 모든 예제에는 AND 쿼리가 있습니다.
편집 : OR 방법은 Rails 5부터 사용할 수 있습니다. ActiveRecord :: QueryMethods를 참조하십시오.
Post.where(column: 'something').or(Post.where(other: 'else'))
Rails 3 ActiveRecord에서 OR 쿼리를 수행하는 방법 내가 찾은 모든 예제에는 AND 쿼리가 있습니다.
편집 : OR 방법은 Rails 5부터 사용할 수 있습니다. ActiveRecord :: QueryMethods를 참조하십시오.
Post.where(column: 'something').or(Post.where(other: 'else'))
답변:
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%'))
matches
will produce LIKE
for sqlite (case insensitive by default) and ILIKE
on postgres (needs explicit case insensitive like operator).
하나의 열 값에 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 연산을 수행하는 방법이 없다고 생각합니다. 귀하의 질문은 멍청한 질문이 아닙니다.
Page.where("pages.column = ? or pages.other_column = ?", value, other_value)
업데이트 된 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 지점으로 병합되었습니다
or
Rails 5에서 사용할 수 있지만 인수 1 개가 전달 될 것으로 예상되므로 이런 방식으로 구현할 수 없습니다. Arel 객체가 필요합니다. 허용 된 답변보기
or
ActiveRecord 의 메소드는 직접 사용하는 경우 작동하지만, 범위 내에서 사용 된 경우 체인을 연결하면 기대치를 깨뜨릴 수 있습니다.
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 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 쿼리 .
Order.where(query.where_values.inject(:or))
arel을 사용하는 것입니다.
MetaWhere의 플러그인은 완전히 놀랍습니다.
OR과 AND를 쉽게 혼합하고 모든 연관 조건을 조인하며 외부 조인을 지정할 수도 있습니다!
Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}
조건에 OR을 추가하십시오.
Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])
레일 + 아렐을 사용하면 더 분명한 방법입니다.
# Table name: messages
#
# sender_id: integer
# recipient_id: integer
# content: text
class Message < ActiveRecord::Base
scope :by_participant, ->(user_id) do
left = arel_table[:sender_id].eq(user_id)
right = arel_table[:recipient_id].eq(user_id)
where(Arel::Nodes::Or.new(left, right))
end
end
생산 :
$ Message.by_participant(User.first.id).to_sql
=> SELECT `messages`.*
FROM `messages`
WHERE `messages`.`sender_id` = 1
OR `messages`.`recipient_id` = 1
Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')