2015-02-06 34 views
1

我有2个命名范围:的Rails:合并范围或代替AND

scope :by_calls, -> {where.not(call_id: nil)} 
scope :by_meetings, -> {where.not(meeting_id: nil)} 

而在未来,我会添加更多的类型,如by_events,by_emails等,并尝试通过一个或更多的人来过滤

有没有一种方法,我怎么能轻易链中这些作用域或

回答

0

这里就是我所做的:

scope :interaction_type_filter, lambda {|interaction_type| 
    allowed_values = ['call', 'meeting'] 
    return nil if interaction_type.blank? 
    sql_statement = interaction_type.first+'_id IS NOT NULL ' 
    interaction_type.shift 
    interaction_type.each do |type| 
     if allowed_values.include? type 
      sql_statement += 'OR '+type+'_id IS NOT NULL' 
     end 
    end 
    where(sql_statement) 
} 

因此,我现在就可以给列

阵列内检查零
0

使用Arel

model = Model.arel_table 
model.where(model[:call_id].eq(nil)).or(model[:meeting_id].eq(nil)) 

只需将Model更改为包含这些范围的模型的名称即可。