当我想用DataMapper进行OR查询时,我使用
result = MyModel.all(:first_name.like => '%john%') + MyModel.all(:last_name.like => '%john%')
这很好,只生成一个SQL查询。 如何使用数组中给出的属性创建相同的结果?
result = [ :first_name, :last_name ].reduce([]) do |sum, prop|
sum + MyModel.all(prop.like => '%john%')
end
虽然这有效,但它使用了两个不同的SQL查询,这不是我想要的。有没有办法在循环中创建这样一个“懒惰”的查询?
答案 0 :(得分:0)
您必须手动构建WHERE子句。像这样:
props = []
values = []
[ :first_name, :last_name ].each do |prop|
props << "(#{prop} LIKE ?)"
values << '%john%'
end
MyModel.all :conditions => [props.join(' OR ')] + values
答案 1 :(得分:0)
我自己想通了。问题是您不能使用空的常规数组([]
)作为结果变量的初始值。我不想深入挖掘DataMapper内部,所以我只是对result
的第一个赋值使用了额外的检查,如下所示:
result = nil
[ :first_name, :last_name ].each do |prop|
cur = MyModel.all(prop.like => '%john%')
next unless cur
result ? result.nil? cur : result + cur
end