2016-08-08 12 views
1

私は1対多の関係を持っています:ユーザーには多くの支払いがあります。私は(支払いテーブルからcreated_atを使用して)各ユーザーの最初の支払いを取得するクエリを検索しようとしています。関連するテーブルから最初のエントリを取得するRuby on Rails

私はSQLの応答で同様の質問を見つけましたが、Active Recordでそれを書く方法はわかりません。

select t.username, t.date, t.value 
from MyTable t 
inner join (
    select username, max(date) as MaxDate 
    from MyTable 
    group by username 
) tm on t.username = tm.username and t.date = tm.MaxDate 

は私にとって、それは最小の代わりに、最大のようになります。

how do I query sql for a latest record date for each user

答えを引用。

ありがとうございました:)

+0

結果はどのように見えますか?すべての支払い?またはユーザーと一緒に来なければなりませんか? – lusketeer

答えて

0

私が来た私はすべてに返信ないため申し訳ありませんが、複数の試験後、これは(実行時間)で最速の答えです:私はそれが原因で最も簡単な方法ではないかもしれないと言っています

Payment.where(:id => Payment.group(:user_id).pluck(:id)) 

私はサブクエリを使用しています。固有の値を取得してIDを取得しています。

Payment.group(:user_id).pluck(:id) 

次に、これらのIDと一致しています。

これの欠点は、前回のお支払いを受けるために元に戻すことができないことです。

group_bymapもありましたが、mapはルビーから来ているので、もっと時間がかかります。

0

をPOSTGRES

Payment.select("DISTINCT ON(user_id) *").order("user_id, created_at ASC") 

そしてSQL

Payment.group(:user_id).having('created_at = MAX(created_at)') 
+0

私はループを使用することはできません、私は1つのクエリですべてをやろうとしています。実際には、1つのクエリから、各ユーザーに対して@ user.payments.firstが必要です。 –

+0

更新された回答を確認してください。あなたのケースに役立つことを願っています –

+0

@FakhirShadはSQLのために、私はそれが 'MIN(created_at)'であるべきだと思います – lusketeer

-1

の場合のために、このいずれかを試してみてください、私はよく分からないが、この試してください:あなたのコントローラで

を:

あなたのhtml.erbで

<% @payments.each do |payment| %> 
    <p> <%= payment.amount %> </p> 

は、このヘルプを願っています!私は上記と質問に答えるつもりならば

+0

私は他の質問で言ったように、私はクエリではなく、ループを探しています:) –

-1
Record.association.order(:created_at).first 
0

ユーザーは多くの支払いを持っている(私は与えられた生のSQLをもとにしていない)。私は(支払いテーブルからcreated_atを使用して)各ユーザーの最初の支払いを取得するクエリを検索しようとしています。

Let say: 
# Assumed to have a Single User, as reference 
user = User.first 

# Now, get first payment (from Payment model) 
user.payments.last 
# .last since it will always get the first created row by created_at. 

あなたがしようとしていることを十分に理解している場合。私はあなたがなぜ必要なのか分からない最大または最小の日付

0

これはどうですか?

お支払いから、各ユーザー

dates = Payment.group(:user_id).minimum(:created_at).values 
payments = Payment.where(created_at: dates) 

の最初の支払いをしたい場合は、あまりにもユーザーを見つけることができます。

あなたは外部キーとしてユーザー名を持っていると思うので、それに応じて変更することができます。 :) 私はそれが動作するようにテストしたので、あなたが問題に直面したら教えてください。

私はこの答えが最高ではないことを知っていますが、レールがmsレベルの日付(created_atおよびupdated_at)を保存するため、ミリ秒の差を付けたトランザクションまたはトランザクションでも機能します。

関連する問題