我需要像赢家一样获取,并且出价可能是针对不同的日期(不要问为什么),因此我需要选择每天最低出价的出价。
以下是我的模特
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)只是在这里解释它,我不会在整个地方使用它,不。
提前致谢
答案 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