2014-08-28 71 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