2

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

这是我的模型

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) 只是在这里解释它,我不是到处使用它,不是。

提前致谢

4

2 回答 2

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)

在铁轨上

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
    }
]
于 2012-06-01T05:57:09.433 回答
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 类

于 2013-09-06T11:14:42.203 回答