Rails:连接同一个表两次并查询连接属性

时间:2014-03-15 14:45:34

标签: ruby-on-rails ruby postgresql activerecord

我有一个Rails应用程序,可以解析来自各种来源的价格信息。模型看起来像这样:

class Price
  attr_accessor :value
  belongs_to :product
  belongs_to :added_pricelist, :class_name => "Scrape"
  belongs_to :removed_pricelist, :class_name => "Scrape"
end

class Product
  attr_accessor :name
end

class PriceList
  attr_accessor :created_at
  has_many :prices
end

每天都有一个刮刀运行,并从API解析产品的一些价格。每次运行刮刀时,它都会创建一个新的PriceList。刮刀记录了价格出现(或消失)的价格 - 因此数据可能看起来像这样。

# NB: Assume product_id is always 1 for these
{ value: 100, added_pricelist_id: 1, removed_pricelist_id: 2 }
{ value: 120, added_pricelist_id: 2, removed_pricelist_id: 3 }
{ value: 140, added_pricelist_id: 3, removed_pricelist_id: 4 }

只有在价格发生变化时才会创建新对象,因此如果它保持不变,您只需:

{ value: 100, added_pricelist_id: 1, removed_pricelist_id: 4 }

我的问题是:使用ActiveRecord,如何找到过去30天内每个产品的平均价格?我需要能够找到特定日期活跃的所有价格,然后平均该数字。可以在一个查询中完成吗? (注意:这是Postgres)。

随意让我澄清任何没有任何意义的事情,并提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

<强> AVG

虽然我对你发布的内容感到有些困惑,但希望我能给你一些帮助:

您至少有两个选择:

  
      
  1. ActiveRecord .average
  2.   
  3. SQL AVG
  4.   

这两个任务都执行相同的任务(除了一个是基于ActiveRecord的),所以我首先看看你的SQL查询是否正确,然后对你拥有的数据执行AVG功能


<强>查询

  

我需要能够找到所有活跃的价格   特定日期,然后平均该数字

我会做这样的事情:

#app/models/PriceList.rb
Class PriceList < ActiveRecord::Base
    scope :today, -> { where(created_at: DateTime.now.at_beginning_of_day.utc..Time.now.utc).average(:value) } 
end

这样您就可以拨打@product.pricelist.today