как я могу получить последние записи из транзакционной таблицы? - PullRequest
0 голосов
/ 11 февраля 2012

Это немного "из коробки" из обычных моделей на основе драгоценных камней AREL или Sequel, поэтому я ищу некоторые рекомендации экспертов.

У меня есть устаревшая (транзакционная) таблица вне моего приложенияэто обновляется каждый раз, когда что-то развертывается.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.Концептуально это последние развертывания для составного ключа, определенного этими четырьмя значениями.

В 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%')).

Другие морщины:

  • У меня нет базы данных, поэтому я не могу добавить представление.
  • Если я создаю свою собственную таблицу, мне нужнобеспокоиться об обновлении данных (транзакционная таблица активна и постоянно обновляется).

Есть идеи?

1 Ответ

1 голос
/ 13 февраля 2012

Вот простой перевод вашего SQL-запроса в код продолжения:

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)
...