从activerecord中的组中选择最小值

时间:2012-06-01 03:04:05

标签: ruby-on-rails ruby activerecord

我需要像赢家一样获取,并且出价可能是针对不同的日期(不要问为什么),因此我需要选择每天最低出价的出价。

以下是我的模特

Leilao
  has_many :bids

Bid
  belongs_to :leilao
  #winner_name
  #price
  #date

我已经尝试了一个解决方案并接近我需要的东西。问题是,在某些情况下,当我以较低的价格创建新的出价时,我不知道为什么结果不会改变。

Leilao.find(1).bids.having('MIN("bids"."price")').group('date').all

这似乎有效,但正如我所说,在我创建新出价时,它在某些情况下不起作用。但它一次正常工作。所以,如果你确实知道会发生什么,请告诉我。

然后我搜索了一些方法,我得到了以下

Leilao.find(1).bids.minimum(:price, :group => :date)

运作正常,但有了这个,我只需提取日期和价格,我需要所有的出价数据。

我可以通过这样做得到它,但对我来说感觉非常糟糕

winner_bids = Leilao.find(1).bids.minimum(:price, :group => :date)
winners_data = []
winner_bids.each do |date, price|
  winners_data << Leilao.find(1).bids.where(price: price, date: date).first
end
winners_data

任何想法都有更好的方法吗?或者我的第一种方法有什么问题?

表演不是问题,因为这仅仅是针对学术建议的,但它对我来说感觉很讨厌

另外那些Leilao.find(1)只是在这里解释它,我不会在整个地方使用它,不。

提前致谢

2 个答案:

答案 0 :(得分:2)

看到这个

mysql> select * from bids;
+----+-------------+-------+------------+-----------+
| id | winner_name | price | date       | leilao_id |
+----+-------------+-------+------------+-----------+
|  1 | A           |   1.1 | 2012-06-01 |         1 |
|  2 | A           |   2.2 | 2012-06-01 |         1 |
|  3 | A           |   3.3 | 2012-05-31 |         1 |
|  4 | A           |   4.4 | 2012-05-31 |         1 |
+----+-------------+-------+------------+-----------+
4 rows in set (0.00 sec)

mysql> select * from bids where leilao_id = 1 group by date order by price asc;
+----+-------------+-------+------------+-----------+
| id | winner_name | price | date       | leilao_id |
+----+-------------+-------+------------+-----------+
|  1 | A           |   1.1 | 2012-06-01 |         1 |
|  3 | A           |   3.3 | 2012-05-31 |         1 |
+----+-------------+-------+------------+-----------+
2 rows in set (0.00 sec)

in rails

1.9.2-p290 :013 > Leilao.find(1).bids.order(:price).group(:date).all
[
    [0] #<Bid:0x00000003553838> {
                 :id => 1,
        :winner_name => "A",
              :price => 1.1,
               :date => Fri, 01 Jun 2012,
          :leilao_id => 1
    },
    [1] #<Bid:0x00000003553518> {
                 :id => 3,
        :winner_name => "A",
              :price => 3.3,
               :date => Thu, 31 May 2012,
          :leilao_id => 1
    }
]

答案 1 :(得分:1)

由于Amol说它不起作用,SQL看起来像

SELECT "whatever".* FROM "whatever" GROUP BY date ORDER BY price

但是group_by将在order_by

之前应用

当我在市场表中存储不同类型的记录时,我遇到了这个问题,我通过编写类方法解决了这个问题,可能不是最好的方法但是工作

def self.zobraz_trh(user)
  markets = []
  area = self.group(:area).all.map &:area
  area.each do |market|
      markets <<  self.where(["area = ? and user_id != ?", market,user]).order(:price).first
  end
    markets
end

其中self是Market class