0

我有一组以地图形式动态生成的参数,例如

(def clauses {:apples 23 :plums 0 :bananas 7})

我想在一个where语句中使用它,所以它应该成为 Korma 查询的等价物:

(select fruit-shop
  (where (or {:apples 23}
             {:plums 0}
             {:bananas 7})))

生成地图列表非常简单:

(map #(apply array-map %)
     (into [] clauses))

但是不能使用(or应用于它的语句,因为它是在宏扩展时处理的,在clauses绑定到它的值之前。

在这种情况下应该使用什么语句?

4

1 回答 1

0

在熟悉了 Korma 源代码后,我发现korma.sql.fns/pred-or了替换and中or语句的函数。所以我写了下面的辅助函数,它接受一个 map 参数wherehaving

(require '[korma.sql.fns :refer [pred-or]])

(defn or*
  [m]
  (apply pred-or
         (map #(apply array-map %)
              (into [] m))))

鉴于此,预期的查询将如下所示

(select fruit-shop
  (where (or* clauses)))
于 2014-07-14T18:56:19.600 回答