2017-11-12 20 views
0

ダウンロードしたファイルを保持するartifactsテーブルがあります。各タイプは異なるデータを保持します。単一のアカウントについてはRailsはサブクラスをクエリし、それぞれを制限します

class Artifact < ActiveRecord::Base 
end 

class ForecastArtifact < Artifact 
end 

class ChargebackArtifact < Artifact 
end 

class CatalogArtifact < Artifact 
end 

、私は、各案件タイプの最新のを照会しています:

artifact_types = Artifact.subclasses.map(&:to_s) 

    artifacts_for_account = artifact_types.map do |type| 
    @account.artifacts 
      .where(type: type) 
      .order("valid_as_of DESC") 
      .limit(1).first 
      .as_json({only: [:id, :account_id, :type]}) 
    end 

残念ながらこれはNクエリを行います。

これに対して行うクエリは1つだけですか?この問題を解決するためのより多くのレールスタイル?あなたは、PostgreSQLを使用している場合

+0

クエリのモデリングとデータの取得に問題があるように見えます。あなたのDBでクエリを動作させ、それをRails/Active Recordに変換してください。 – Sairam

+0

データベース構造を共有してもらえますか? –

答えて

0

、あなたはこれを解決するためにDISTINCT ONを使用することができます。これは、アカウントごとに一つだけのクエリーを必要と

>> a = Account.last 
    Account Load (0.4ms) SELECT "accounts".* FROM "accounts" ORDER BY "accounts"."id" DESC LIMIT $1 [["LIMIT", 1]] 
=> #<Account id: 1, created_at: "2017-11-17 17:16:03", updated_at: "2017-11-17 17:16:03"> 

>> a.artifacts.select("distinct on (type) valid_as_of, type, id").group(:type, :valid_as_of, :id).order(:type, valid_as_of: :desc) 
    Artifact Load (0.6ms) SELECT distinct on (type) valid_as_of, type, id FROM "artifacts" WHERE "artifacts"."account_id" = $1 GROUP BY "artifacts"."type", "artifacts"."valid_as_of", "artifacts"."id" ORDER BY "artifacts"."type" ASC, "artifacts"."valid_as_of" DESC LIMIT $2 [["account_id", 1], ["LIMIT", 11]] 
=> #<ActiveRecord::AssociationRelation [#<ChargebackArtifact id: 22, type: "ChargebackArtifact", valid_as_of: "2017-11-17 17:06:03">, #<ForecastArtifact id: 21, type: "ForecastArtifact", valid_as_of: "2017-11-17 17:11:03">]> 

関連する問題