0

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

4

2 回答 2

0

您必须手动构建 WHERE 子句。像这样的东西:

props = []
values = []
[ :first_name, :last_name ].each do |prop|
  props << "(#{prop} LIKE ?)"
  values << '%john%'
end
MyModel.all :conditions => [props.join(' OR ')] + values
于 2012-07-28T18:33:15.460 回答
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
于 2012-07-30T16:09:32.670 回答