0

私のユースケースは単純です。これが私のモデルです。

Auction
===============
id
name
expiration_date

AuctionImage
===============
id
auction_id
image_path
filesize

Auctions少なくとも 1 を持つものをすべて取得しAuctionImage、 で並べ替えたいと思いexpiration_dateます。

class Auction < ActiveRecord::Base
  has_many :auction_images
end

class AuctionImage < ActiveRecord::Base
  belongs_to :auction
end

助言がありますか?

4

2 に答える 2

1
Auctions.joins(:auction_images).group(:id).order(:expiration_date)
于 2013-08-11T02:57:57.197 に答える
0

最速の SQL メソッドは、EXISTS 相関サブクエリである可能性が高く、パフォーマンスは見つかった子レコードの数に依存しません。

Rails でこれを実現するには、次のようにする必要があります。

Auction.where("exists (select null from auction_images where aution_images.auction_id = auctions.id)").order("auctions.expiration_date desc")

オークションごとに非常に少数の画像のみが予想される場合は、外部結合ベースの方法が機能しますが、group by または distinct が必要なために、クエリから最初の行が返されるのが遅くなり、メモリ消費量が増加する可能性があります。データベース サーバー。

オプティマイザーが有益なインデックスを見つけない限り、expiration_date の順序はいずれにせよ処理を遅くします。

于 2013-08-12T17:27:44.420 に答える