[ruby-on-rails] AND 대신 OR로 범위 쿼리를 연결하는 방법은 무엇입니까?

Rails3, ActiveRecord를 사용하고 있습니다

AND가 아닌 OR 문으로 범위를 연결하는 방법이 궁금합니다.

예 :

Person.where(:name => "John").where(:lastname => "Smith")

일반적으로 다음을 반환합니다.

name = 'John' AND lastname = 'Smith'

그러나 나는 싶습니다 :

`name = 'John' OR lastname = 'Smith'



답변

당신은 할 것

Person.where('name=? OR lastname=?', 'John', 'Smith')

현재 새로운 AR3 구문에 의한 다른 OR 지원은 없습니다 (즉, 일부 타사 gem을 사용하지 않음).


답변

에 따르면 이 풀 요청 , 레일 (5)는 이제 쿼리를 체인에 대해 다음 구문을 지원합니다 :

Post.where(id: 1).or(Post.where(id: 2))

이 gem을 통해 Rails 4.2에 기능의 백 포트도 있습니다 .


답변

ARel 사용

t = Person.arel_table

results = Person.where(
  t[:name].eq("John").
  or(t[:lastname].eq("Smith"))
)


답변

동일한 열 또는 쿼리에 대해 배열 구문을 게시하면 엿볼 수 있습니다.

Person.where(name: ["John", "Steve"])


답변

Rails4 업데이트

타사 보석이 필요하지 않습니다

a = Person.where(name: "John") # or any scope 
b = Person.where(lastname: "Smith") # or any scope 
Person.where([a, b].map{|s| s.arel.constraints.reduce(:and) }.reduce(:or))\
  .tap {|sc| sc.bind_values = [a, b].map(&:bind_values) }

이전 답변

타사 보석이 필요하지 않습니다

Person.where(
    Person.where(:name => "John").where(:lastname => "Smith")
      .where_values.reduce(:or)
)


답변

MetaWhere gem을 사용 하여 코드를 SQL과 섞지 않을 수도 있습니다 .

Person.where((:name => "John") | (:lastname => "Smith"))


답변

누구 든지이 답변에 대한 업데이트 된 답변을 찾고 있다면 Rails https://github.com/rails/rails/pull/9052 로 가져 오는 기존 풀 요청이있는 것처럼 보입니다 .

ActiveRecord ( https://gist.github.com/j-mcnally/250eaaceef234dd8971b )에 대한 @ j-mcnally의 원숭이 패치 덕분에 다음을 수행 할 수 있습니다.

Person.where(name: 'John').or.where(last_name: 'Smith').all

더 중요한 것은 다음과 OR같이 범위를 연결할 수있는 기능입니다 .

scope :first_or_last_name, ->(name) { where(name: name.split(' ').first).or.where(last_name: name.split(' ').last) }
scope :parent_last_name, ->(name) { includes(:parents).where(last_name: name) }

그런 다음 이름 또는 성 또는 이름을 가진 부모를 가진 모든 사람을 찾을 수 있습니다

Person.first_or_last_name('John Smith').or.parent_last_name('Smith')

이것을 사용하는 가장 좋은 예는 아니지만 질문에 맞추려고합니다.