简体   繁体   English

在Rails中查询联接关联

[英]Query for join associations in rails

Campaign have attributes :start_date,:end_date 广告系列具有:start_date,:end_date属性

Invoice have attributes :start_date,:end_date 发票具有:start_date,:end_date属性

campaign.rb campaign.rb

has_many:invoices

invoice.rb invoice.rb

belongs_to:campaign

I want to get all those cmapaigns whose start_date is less than current date AND whose end_date is between campaign.invoices.last.created..current_date 我想所有这些cmapaigns其start_date小于当前日期ANDend_date之间campaign.invoices.last.created..current_date

How I query for this? 我该如何查询?

Try this: 尝试这个:

 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)")

I never used Rails magic to perform more-or-less complicated requests against database. 我从未使用过Rails魔术来对数据库执行或多或少的复杂请求。 It always results in drastic overhead, N+1 queries, or some unexpected penalties. 它总是会导致大量的开销,N + 1个查询或一些意外的罚款。 Here is the plain old good SQL version to perform this task: 这是执行此任务的普通的老式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

The above was not tested for the obvious reason, but it should work either as is or with slight modifications. 出于明显的原因,上面的代码没有经过测试,但是应该可以按原样或稍作修改就可以工作。

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