1
我有2个命名范围:的Rails:合并范围或代替AND
scope :by_calls, -> {where.not(call_id: nil)}
scope :by_meetings, -> {where.not(meeting_id: nil)}
而在未来,我会添加更多的类型,如by_events,by_emails等,并尝试通过一个或更多的人来过滤
有没有一种方法,我怎么能轻易链中这些作用域或
我有2个命名范围:的Rails:合并范围或代替AND
scope :by_calls, -> {where.not(call_id: nil)}
scope :by_meetings, -> {where.not(meeting_id: nil)}
而在未来,我会添加更多的类型,如by_events,by_emails等,并尝试通过一个或更多的人来过滤
有没有一种方法,我怎么能轻易链中这些作用域或
这里就是我所做的:
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)
}
因此,我现在就可以给列
阵列内检查零使用Arel:
model = Model.arel_table
model.where(model[:call_id].eq(nil)).or(model[:meeting_id].eq(nil))
只需将Model
更改为包含这些范围的模型的名称即可。