#ruby-on-rails #postgresql #ruby-on-rails-4 #rake #postgresql-9.5
#ruby-on-rails #postgresql #ruby-on-rails-4 #грабли #postgresql-9.5
Вопрос:
Я ускорил некоторые статистические отчеты в своем проекте rails (4.2.7, база данных postgres 9.5), создав представления sql.
Я написал весь код в pgAdmin, проверил все данные в представлениях. Затем я сгенерировал миграцию в своем проекте rails и скопировал весь написанный код sql в миграцию.
Когда я запускаю миграцию, все представления создаются со случайно отсутствующими данными.
Пример:
create or replace view revenue_by_date as
select sum(reward) as reward_coins, count(ot.id) as amount, (sum(reward)::float / substring(value from '---s''(d )''')::bigint) as reward_dollars,
ot.created_at::date as date
from offerwall_transactions ot
inner join settings on var = 'exchange_rate'
where ot.reward > 1
group by ot.created_at::date, settings.value;
Я получаю данные reward_dollars отсутствуют.
Однако при создании с помощью PGA данные в порядке
Структура таблицы транзакций Offerwall:
У меня такие же проблемы с другими взглядами. Некоторые представления создаются вообще без каких-либо данных.
Где ошибка?
Комментарии:
1.
on var = 'exchange_rate'
не очень специфично. Вероятно, это приведет к картезианскому произведению.2. ‘var’ — это текстовый столбец в «настройках». Я постараюсь использовать более конкретные ‘settings.var’.
3. Но по-прежнему нет подключения к
offerwall_transactions
таблице, вы ограничиваете только константу (аналогично для предложения WHERE)4. Да, нет соединения между «настройками» и «offerwall_transactions». Мне просто нужно получить значение поля ‘exchange_rate’ для вычисления. В принципе, просто
select reward / (select settings.value from settings where settings.var='exchange_rate') from offerwall_transactions
. В этом случае соединение лучше, не так ли?5. Итак,
settings.var
является ли ключ-кандидат (или PK) для таблицы настроек? Кстати: на этот вопрос нельзя ответить без подробной информации о модели данных (я предполагал, что это своего рода структура, подобная EAV)