0

これは、通常の AREL または Sequel の gem ベースのモデルとは少し「すぐに使える」ものなので、専門家のガイダンスを探しています。

何かがデプロイされるたびに更新される、アプリの外部にあるレガシー (トランザクション) テーブルがあります。Deployments次のようになります。

    DEPLOY_ID | APP_DEPLOY_NAME | DEPLOY_TYPE | DOMAIN | DEPLOY_ENV | ...
    1         | adn             | dta         | ruby   | dev1       | ...
    2         | adn             | dta         | ruby   | dev1       | ...      
  * 3         | adn             | dta         | ruby   | dev1       | ...
  * 4         | adn             | dta         | ruby   | dev2       | ...
  * 5         | adnb            | dta         | ruby   | dev1       | ...

上記のマークされた線は、DEPLOY_ID一意のAPP_DEPLOY_NAME + DEPLOY_TYPE + DOMAIN + DEPLOY_ENVエントリごとの最高値を表しています。概念的には、これらはこれら4 つの値によって定義される複合キーの最新の展開です。

SQL では、自己結合を使用してこのビューを簡単に作成できます。

select deployments.* from
  -- deploy_max
  (select max(DEPLOY_ID) as DEPLOY_ID from DEPLOYMENTS
  group by APP_DEPLOY_NAME, DEPLOY_TYPE, DOMAIN, DEPLOY_ENV) deploy_max 
join DEPLOYMENTS as deployments on 
  deploy_max.DEPLOY_ID = deployments.DEPLOY_ID
order by deployments.APP_DEPLOY_NAME asc, 
         deployments.DEPLOY_TYPE asc, 
         deployments.DOMAIN asc

(おそらくもっと良い書き方がありますが、それは私がやろうとしていることを示しています)

ただし、これはクエリチェーンの利点を失います...つまり、次のようなものを取得できないようです: latest.filter(:APP_DEPLOY_NAME.like('%adn%'))

その他のシワ:

  • 私はデータベースを所有していないので、ビューを追加できません。
  • 独自のテーブルを作成する場合、データの更新について心配する必要があります (トランザクション テーブルはライブであり、継続的に更新されます)。

何か案は?

4

1 に答える 1

1

SQL クエリを Sequel コードに簡単に変換すると、次のようになります。

DB[:deployments].
  select{max(deploy_id).as(deploy_id)}.
  group(:app_deploy_name, :deploy_type, :domain, :deploy_env).
  from_self(:alias=>:deploy_max).
  join(:deployments, :deploy_id=>:deploy_id).
  select_all(:deployments).
  order(:deployments__app_deploy_name, :deployments__deploy_type, :deployments__domain)
于 2012-02-13T16:59:16.453 に答える