延迟添加DataMapper导致循环

时间:2012-07-27 17:24:34

标签: sql ruby datamapper

当我想用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查询,这不是我想要的。有没有办法在循环中创建这样一个“懒惰”的查询?

2 个答案:

答案 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