【问题标题】:Lazy-add DataMapper results in a loop延迟添加 DataMapper 导致循环
【发布时间】:2012-07-26 10:02:23
【问题描述】:

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

【问题讨论】:

    标签: sql ruby datamapper


    【解决方案1】:

    我自己想通了。问题是您不能使用空的常规数组 ([]) 作为结果变量的初始值。我不想深入挖掘 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
    

    【讨论】:

      【解决方案2】:

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

      props = []
      values = []
      [ :first_name, :last_name ].each do |prop|
        props << "(#{prop} LIKE ?)"
        values << '%john%'
      end
      MyModel.all :conditions => [props.join(' OR ')] + values
      

      【讨论】:

      • 当然可以,但我认为这是一个非常不雅的解决方案,尤其是因为有更好的方法来做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2020-10-22
      • 1970-01-01
      • 2021-05-30
      相关资源
      最近更新 更多