2014-08-28 40 views
1

我有一些複雜的布爾方法,我想用作數據庫查詢結果的過濾器。我想要一個適用於SQL和Mongoid DB的解決方案。Rails應用布爾方法來過濾查詢結果

class Bar < ActiveRecord::Base OR include Mongoid::Document 

    [field :some_field] 

    def method1? 
    ... 
    end 

    def method1? 
    ... 
end 

這是我想什麼寫什麼:

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

有沒有一種簡單的方法比要這麼做:

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

什麼是這些方法的內容的一個例子?你能把它們變成可以鏈接到你的「呼叫」的範圍嗎? – jstim 2014-08-28 19:13:39

+0

現在它只是一個正則表達式('def method1?{self.role.downcase =〜/.*tr[e|¬¬]so.*/}')但後來我可能想添加其他一些東西。我讀過其他職位,我可以使用SQL查詢,比如'Where Regexp%',但如果可能的話,我寧願使用ruby/rails的東西。 – 2014-08-28 20:17:43

+0

另外,我並不關心性能。而不是複雜高效的代碼,因此易於理解和低效的代碼 – 2014-08-28 20:21:17

回答

1

好吧其實我已經使用了三個不同的技術來實現我的目標:named_scopes,布爾函數和數組過濾

This link explains array filtering

在我的代碼(使用兩個named_scopes,正則表達式,以及濾波):

# 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