【问题标题】:Ruby on Rails: How to query relation objects based on date rangeRuby on Rails:如何根据日期范围查询关系对象
【发布时间】:2017-03-12 22:54:45
【问题描述】:

我有

class Campaign < ApplicationRecord
 has_many :clicks
 has_many :cpas
 has_many :ftds
 has_many :signups
end

class Click < ApplicationRecord
  belongs_to :campaign
end

class Cpa < ApplicationRecord
  belongs_to :campaign
end

class Ftd < ApplicationRecord
  belongs_to :campaign
end

class Signup < ApplicationRecord
  belongs_to :campaign
end

模型点击次数、每次转化费用、ftds、注册是在广告系列模型的整个时间内发生的事件。我想创建一个报告页面,列出所有活动,并在每一行显示给定时间(本月)发生(created_at)的事件(点击次数、每次转化费用、ftds、注册)。

在我的尝试中,我得到了包含该月事件的广告系列,但行中列出的数据带来了我选择的其他月份发生的事件,以及其他月份发生的事件。

def self.filter_by_date(start_date = Time.now.beginning_of_month, end_date = Time.now.end_of_month)
  joins(:clicks).where(clicks: {created_at: start_date..end_date}) +
  joins(:ftds).where(ftds: {created_at: start_date..end_date}) +
  joins(:cpas).where(cpas: {created_at: start_date..end_date}) +
  joins(:signups).where(signups: {created_at: start_date..end_date})
end

抱歉英语不太好,我是巴西人。

【问题讨论】:

  • 不确定您卡在哪一点上,这有帮助吗? stackoverflow.com/questions/2381718/…
  • 我的大问题与 joins @TonyHopkinson 更相关。不过还是谢谢 :D
  • 也许您可以添加您的查询代码,显示一个不起作用的示例?
  • @MarcRohloff 我编辑了问题,添加了更多信息和我尝试过的代码,也许它可以帮助你:D

标签: sql ruby-on-rails ruby activerecord associations


【解决方案1】:

Tenho certeza que sua Ingles e melhor do que o meu 葡萄牙语。如果您展示了如何显示这些数据可能会有所帮助。正如您所写的那样,它将获取在此期间内具有点击、ftds、cpas 或注册的所有广告系列,然后(我假设)显示每个广告系列的所有点击等。它也可能有重复的广告系列。根据您要执行的操作,您可以:

  • 分别获取每种类型并显示它:

    clicks = Clicks.where(created_at: start_date..end_date)
    render_clicks(clicks)
    ftds = Ftds.where(created_at: start_date..end_date)
    render_ftds(ftds)
    
  • 这样写:

    def self.filter_by_date(start_date = Time.now.beginning_of_month, end_date = Time.now.end_of_month)
      condition = {created_at: start_date..end_date}  
      self.includes(:clicks ).where(clicks:  condition)
          .includes(:ftds   ).where(ftds:    condition)
          .includes(:cpas   ).where(cpas:    condition)    
          .includes(:signups).where(signups: condition)
    end
    

这将为您提供所有论文,但仅提供在这些日期之间创建的点击次数、ftds、注册次数和注册次数。

  • 如果您的目标是返回在此期间有活动的广告系列,则可以编写查询来执行此操作,但它会很复杂并且效果不佳。我会添加一个last_activity' column to thecampaignstable of typedatetime`,然后将您的代码更改如下:

    class Click < ApplicationRecord
      belongs_to :campaign, touch: :last_activity
    end
    
    class Cpa < ApplicationRecord
      belongs_to :campaign, touch: :last_activity
    end
    
    class Ftd < ApplicationRecord
      belongs_to :campaign, touch: :last_activity
    end
    
    class Signup < ApplicationRecord
      belongs_to :campaign, touch: :last_activity
    end
    
    def self.filter_by_date(start_date = Time.now.beginning_of_month, end_date = Time.now.end_of_month)
      where(last_activity: start_date..end_date)
    end
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多