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 はマーケット クラスです

于 2013-09-06T11:14:42.203 に答える