[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')
이것을 사용하는 가장 좋은 예는 아니지만 질문에 맞추려고합니다.