как я могу получить последние записи из таблицы транзакций?

Это немного «нестандартно» по сравнению с обычными моделями на основе драгоценных камней 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%')).

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

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

Любые идеи?


person Larry Kyrala    schedule 10.02.2012    source источник
comment
Итак, игнорируя заголовок вашего вопроса, ваш фактический вопрос заключается в том, как создать набор данных Sequel, который создает это объединенное представление?   -  person Phrogz    schedule 12.02.2012
comment
Конечно, это сработает, у вас есть решение? (Я не хотел ограничивать ответы Sequel vs. AREL, так как я работал с обоими и приветствовал бы подходы в любом из них — кроме того, способ, которым я делаю это в SQL, может быть «трудным путем» и может быть, есть другой способ переосмыслить всю проблему, который проще — вот почему я сделал заголовок как можно более общим.)   -  person Larry Kyrala    schedule 12.02.2012
comment
Я должен добавить, что это не так просто, как DB[sql_statement], потому что, хотя это тривиальный способ получить набор данных, набор данных (очевидно?) не применяет правила цепочки запросов. Возможно, есть более продвинутый способ написания собственных расширений для ORM, который справляется с этим, но мне было трудно найти примеры того, как это сделать.   -  person Larry Kyrala    schedule 12.02.2012


Ответы (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)
person Jeremy Evans    schedule 13.02.2012