2012-03-20 8 views
4

TradeExecutionの間にActiveRecordの関係があります。私はアクティブレコード。 Model.Find.last

Trade.executions.last 

を行う場合は、IDに基づいて、最後の実行記録を返すように見えるようだ

Trade.executions #returns all exeuctions realated to the Trade 

を得ることができます。

これは、IDに基づくTradeに関連する最後の実行レコードを取得する正しい方法ですか?

答えて

11

いいえ、最高のidの実行を保証するものではありません。明示的な順序付けを指定しない場合、レコードは任意の順序でデータベースから出力されます。 idでソートされているように見えるという事実は、便利な事故です。

あなたはこれらのいずれかの実行する必要があります。

highest_id_execution = trade.executions.order(:id).last 
highest_id_execution = trade.executions.order('id desc').first 

あなたに最高idを持ってtradeの実行を与えるだろう。あなたが本当に最近作成したものにしたいなら、あなたはorder(:created_at)代わりにする必要があります

most_recent_execution = trade.executions.order(:created_at).last 
most_recent_execution = trade.executions.order('created_at desc').first 

idcreated_at列はほとんど常に同じ順序で来るだろうが、あなたは、あなたがその人に物事を明確にするために何を意味するかと言う必要がありますあなたのコードを維持してください。

どちらの場合でも、order(:x).lastorder('x desc').firstはまったく同じものであり、まったく同じSQLに解決されるので、どちらかがあなたに最も合っているものを使用してください。

+2

+1、あなたは'を追加することができますこれは 'trade.executions.last'は' id'ではなく 'timestamp'に基づいて最後の実行を返します。 –

+0

@KandadaBoggu:十分な真実ですが、私は不必要なORDER BYと 'reorder'sを避けるために最小限の関連付けを好みます。 –

+0

私は、このアプローチをデフォルトのソート順を乗り越えて直感的なものにする非常にまれなケースで使用することを理解しています。 –

1

#lastは、主キーに基づいて最後のレコードを返します。主キーがidでない場合は、より明示的にする必要があります。 `にorder`オプション:@muistooshortが述べたように

がこれはdocumentationcode

で、それが明示的であることを傷つけることはありませんされ、両方:)

関連する問題