2017-04-24 4 views
1

フィールドnameversionを持つgraphsテーブルがあります。レコードが挿入されるたびに、名前はデータベースに存在しない場合は0、それ以外の場合はmax(version) + 1となります。一意の名前ごとに最高のバージョンのレコードのリストを取得したいと思います。次のコードは、この行いますグループ内の特定のフィールドの最大値を持つレコードを見つける方法

def self.latest_versions 
    Graph.group(:name).maximum(:version).map{ |k,v| find_by name: k, version: v} 
end 

が、私はちょうど範囲チェーンアクティブレコードリレーションを使用してこれを行うにははるかに速い方法があるかどうだろうか?

答えて

1

方法については、この

def self.latest_versions 
    name_versions = Graph.group(:name).maximum(:version).map {|k,v| [k,v].join(';')} 
    Graph.where("concat(name, ';', version) IN (?)", name_versions) 
end 

合成カラムに通して、クエリによって、1に2列をCONCAT配列、に変換、name, versionグループを取得し、私たちは別のSQLクエリを必要とした後、完全に2既存のものよりはるかに優れています。

+0

これはうまくいかないと思いますが、すべてのグラフに最大バージョン番号のレコードが返されます。 :nameフィールドで区別されるさまざまな種類のグラフがあります。各タイプのグラフには独自のバージョンがありますので、名前が 'line_plot'の最新のグラフはバージョン5で、名前が 'bar_plot'の最新のグラフはバージョン7です。コードはバージョン7のみを返します。 'bar_plot'、しかし、私はバージョン7または 'bar_plot'とバージョン5の 'line_plot'の両方を返す必要があります。 – Obromios

+0

今、誤解をおかけして申し訳ありません。 –

+0

@Obromios私は 'answer'を更新しました。あなたはそれを確認することができます。 –

関連する問題