簡體   English   中英

在Rails中查詢聯接關聯

[英]Query for join associations in rails

廣告系列具有:start_date,:end_date屬性

發票具有:start_date,:end_date屬性

campaign.rb

has_many:invoices

invoice.rb

belongs_to:campaign

我想所有這些cmapaigns其start_date小於當前日期ANDend_date之間campaign.invoices.last.created..current_date

我該如何查詢?

嘗試這個:

 Compaign.joins(:invoices)
            .where("compaigns.start_date < :today AND compaigns.end_date < :today", today: Date.today)
            .group("compaigns.id")
            .having("compaigns.end_date > MAX(invoices.created_at)")

我從未使用過Rails魔術來對數據庫執行或多或少的復雜請求。 它總是會導致大量的開銷,N + 1個查詢或一些意外的罰款。 這是執行此任務的普通的老式SQL版本:

Campaign.connection.execute <<-SQL
   SELECT campaigns.*, last_invoice_date
   FROM campaigns 
     JOIN (
       SELECT invoices.campaign_id AS campaign_id,
              MAX(invoices.started) AS last_invoice_date
       FROM invoices
       GROUP BY invoices_campaign_id
     ) AS last_invoices
     ON (last_invoices.campaign_id = campaigns.id)
     WHERE campaigns.start_date < NOW()
       AND campaigns.end_date < NOW()
       AND campaigns.end_date >= last_invoices.last_invoice_date
SQL.to_a

出於明顯的原因,上面的代碼沒有經過測試,但是應該可以按原樣或稍作修改就可以工作。

campaigns = Campaign.where("DATE(start_date) < ?", Date.today).includes(:invoices)

invoices = campaigns.each do |campaign|
              campaign.invoices.where("Date(campaigns.end_date)" BETWEEN campaign.invoices.last.created_at.to_date AND Date.today)
           end

invoices.map(&:campaign)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM