如何查询具有属性对数组的记录?

时间:2019-06-05 14:54:09

标签: ruby-on-rails activerecord

我在Rails应用程序中有一个Product模型,具有多个属性,包括item_idbatch。如果我想获得一个Product,可以使用以下方法:

Product.find_by(item_id: 'ITEM001', batch: `05-2019`) 

但是我所拥有的是['item_id','batch']的数组,像这样:

[
  ['ITEM001', '05-2019']
  ['ITEM001', '04-2019']
  ['ITEM002', '04-2019']
]

如何获取与数组中的属性对匹配的所有产品?

产品模型使用item_idbatch作为组合键。这两个属性的组合使产品具有独特性。

示例场景

假设我只想要上述记录中的以下结果:

[
  ['ITEM001', '05-2019']
  ['ITEM002', '04-2019']
]

我考虑过这样做:

Product.where(item_id: ['ITEM001', 'ITEM002'], batch: ['05-2019', '04-2019'])

通过将item_idbatch映射到单独的数组中。但是,这将使我在顶部提到的所有三个项目都得到解决。

2 个答案:

答案 0 :(得分:1)

您必须根据参数在where条件中创建原始SQL

value_array = [
  ['ITEM001', '05-2019'],
  ['ITEM001', '04-2019'],
  ['ITEM002', '04-2019']
]


query = value_array.map { |ele| ele.join('\' AND batch = \'').prepend('item_id = \'') + '\'' }.join(' OR ')


Product.where(query)

答案 1 :(得分:-1)

获取所有item_id和批次,然后进行查询:

array = [['ITEM001', '05-2019'], ['ITEM001', '04-2019'], ['ITEM002', '03-2019']]

item_ids = array.map { |arr| arr.first } # ["ITEM001", "ITEM001", "ITEM002"]
batches = array.map { |arr| arr.last } # ["05-2019", "04-2019", "03-2019"]

Product.where(item_id: item_ids, batch: batches)