Это немного «нестандартно» по сравнению с обычными моделями на основе драгоценных камней 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%'))
.
Другие морщины:
- У меня нет базы данных, поэтому я не могу добавить представление.
- Если я создаю свою собственную таблицу, мне нужно беспокоиться об обновлении данных (таблица транзакций активна и постоянно обновляется).
Любые идеи?
DB[sql_statement]
, потому что, хотя это тривиальный способ получить набор данных, набор данных (очевидно?) не применяет правила цепочки запросов. Возможно, есть более продвинутый способ написания собственных расширений для ORM, который справляется с этим, но мне было трудно найти примеры того, как это сделать. - person Larry Kyrala   schedule 12.02.2012