Rails:将范围与OR而不是AND组合

时间:2015-02-06 07:40:15

标签: sql ruby-on-rails activerecord

我有2个命名范围:

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

将来,我会添加更多类型,例如by_events,by_emails等,并尝试按其中的一个或多个进行过滤

有没有办法通过OR

轻松链接这些范围

2 个答案:

答案 0 :(得分:0)

使用Arel

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

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

答案 1 :(得分: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)
}

因此我现在可以检查给定列数组中的nil