0

我有一个查询:

    campaignData = Event
      .where(campaign_id: Campaign.where(customer_id: params[:customer_id]))
      .where('scheduled >= CURDATE() - INTERVAL 7 DAY')
      .limit('30')

我用它来显示 html 上的数据。现在我使用了一些过滤器,它应该从前 30 个数据中过滤数据。因为我使用 limit(30) 数据超过一百万。

筛选:

    if !params[:channel].blank?
      campaignData = campaignData.where(channel: params[:channel])
    end

    if !params[:offerType].blank?
      campaignData = campaignData.where(offerType: params[:offerType])
    end

它给了我另一组我不需要的 30 个结果。它应该从之前的 30 个数据集中过滤。

不能使用循环,因为

我在用

    campaignData = campaignData.where(audienceQuery)

其中 AudienceQuery 是来自前端的查询传递,使用QueryBuilder. 哪个是最重要的。

提前致谢。

我们可以使用内连接,运行另一个查询然后与它合并。尝试了许多方法,但无法从数据集中过滤数据。

4

1 回答 1

0

如果您想在响应中有准确的 30 条记录(不要担心数百万条记录。此查询将由数据库处理,并且如果您定义正确的索引则不会产生开销)试试这个:

campaignData = Event
      .where(campaign_id: Campaign.where(customer_id: params[:customer_id]))
      .where('scheduled >= CURDATE() - INTERVAL 7 DAY')

if !params[:channel].blank?
  campaignData = campaignData.where(channel: params[:channel])
end

if !params[:offerType].blank?
  campaignData = campaignData.where(offerType: params[:offerType])
end

campaignData = campaignData.limit('30')

如果您想在限制后应用过滤器,请尝试以下操作:

if !params[:channel].blank?
  campaignData = campaignData.select{ |cd| cd.channel == params[:channel] }
end

if !params[:offerType].blank?
  campaignData = campaignData.select{ |cd| cd.offerType == params[:offerType] }
end
于 2019-11-25T09:15:52.030 回答