1

同様の質問を見たことがありますが、必要なものと正確に一致する回答はありません。そこにあるとしたら、私はそれを見たことがない。私はRails 3.1、Ruby 1.9.2をHeroku Cedarスタックにデプロイしています(したがって、postgresを使用しています)

私はこのモデルを持っています:

class User
  has_many :orders
end

class Order
  belongs_to :user

  #scope :last_for_each_user, ???
  #scope :first_for_each_user, ???

end

すべてのユーザーの最初の注文であるすべての注文と、すべてのユーザーの最後の注文であるすべての注文を返すスコープ (またはメソッド) が必要です。私の最初の本能は、SQLite3 の :last_for_each_user で問題なく機能した GROUP BY を使用することでしたが、Postgres では、GROUP BY 句に含まれていないか、集計関数の一部として選択されている列を選択できません。完全に形成された順序が必要です。オブジェクト (つまり、すべての列、orders.*)。

何か案は?テーブル全体を選択してRubyで並べ替えたくありません。それは気分が悪いだけで、記憶に保持することはたくさんあります.

4

2 に答える 2

1

だから、将来のヘッドスクラッチャーのために、私がやったことは次のとおりです。

scope :last_for_each_user, lambda {
  select("orders.*") & Order.select("max(orders.id) as id").group("orders.user_id")
}
scope :first_for_each_user, lambda {
  select("orders.*") & Order.select("min(orders.id) as id").group("orders.user_id")
}

誰かがより良いアイデアを持っているなら、私はそれを聞いて非常にオープンです。そして、SOコミュニティ全体のおかげで(誰も応答しなかったとしても)、これは私がサインアップ/質問をしたのは初めてですが、問題をグーグルで検索するたびに、私はここに行き着きます!

于 2012-07-03T21:10:09.900 に答える
0

ルールを使用してDISTINCT ON()、最後のルールのみを取得できます。モデル構造に従った例を次に示します。

scope :for_users, lambda {|ids, is_first| includes(:user).where("user_id IN (?)", ids).select("DISTINCT ON (users.id) *").order("orders.created_at ?", is_first ? : "ASC" : "DESC") }
scope :last_for_each_users, lambda { |users| for_each_users(users.map{|u| u.id }, false }
scope :first_for_each_users, lambda { |users| for_each_users(users.map{|u| u.id }, true }
于 2012-07-22T19:30:07.343 に答える