2014-08-28 4 views
1

데이터베이스 쿼리 결과에 대한 필터로 사용하려는 복잡한 부울 메서드가 있습니다. 나는 SQL과 Mongoid DB 모두에서 작동 할 수있는 솔루션을 원한다.레일은 부울 메서드를 사용하여 쿼리 결과를 필터링합니다.

def self.someFunc 
    results = Array.new 
    Bar.where(some_field: some_value).each do |result| 
     if result.filter1? && result.filter2? 
      results << result 
     end 
    end 
    results 
end 
+0

이러한 방법의 내용의 예는 무엇입니까 : 내 코드에서

(모두 named_scopes, 정규 표현식 및 필터링을 사용)? 당신이 당신의'where' 콜에 연결할 수있는 범위로 만들 수 있습니까? – jstim

+0

지금은 단지 regexp입니다 ('def method1? {self.role.downcase = ~ /.*t[[[]].*/}')하지만 나중에 다른 것들을 추가하고 싶을 수도 있습니다. 나는'% Regexp % '와 같은 역할을하지만 가능한 경우 루비/레일을 사용하는 SQL 쿼리를 사용할 수 있다고 읽었습니다. –

+0

또한 성능에 대해서는 전혀 신경 쓰지 않습니다. 복잡한 코드보다 쉽게 ​​이해할 수 있고 비효율적 인 코드가 있습니다. –

답변

1

좋아 실제로 내가 사용했던 세 가지 기술에 :

def self.someFunc 
    Bar.where(some_field: some_value).filter(method1?, method2?) 
end 

그렇게하는 것보다 간단한 방법이 있나요 :
class Bar < ActiveRecord::Base OR include Mongoid::Document 

    [field :some_field] 

    def method1? 
    ... 
    end 

    def method1? 
    ... 
end 

내가 쓰고 싶은 것입니다 목표 달성 : 명명 된 스코프, 부울 함수 및 배열 필터링

This link explains array filtering

# Named scopes : 
scope :current_team, ->{ where(mandate: Constants.mandate)} 

# Boolean function : 
def prez? 
    self.role.downcase =~ /.*pre[sident|z].*/ 
end 

# Array filtering : 
def self.prez 
    Bar.current_team.select {|admin|admin.prez?} 
end.first 
관련 문제