Можете ли вы создать модель рельсов с поддержкой базы данных без таблицы?
У меня есть сложный SQL-запрос, который объединяет столбцы с помощью
group_by
.
IndividualOrder.select(SUM(...) as amount, other_fields).group_by("organization.id")
Проблема в том, что я получаю ActiveRecord::Relation от
IndividualOrder
, что на самом деле не является результатом концептуально. Я не совсем уверен, как перевести его на новый метод. Если я использую
arel
чтобы справиться с этим, мне все равно обычно приходилось бы идти
IndividualOrder.arel_table
, и он все равно будет приведен к тому, что я выберу.
Я просто хочу взять поля
[:amount, :organization, :other]
и иметь возможность взаимодействовать с ними, как если бы я использовал модель, основанную на базе данных, которая имела бы эти значения в виде таблицы.
Таким образом, это не совсем бестабличная модель (которая обычно не поддерживается базой данных) и не фактическая модель, поскольку это сгенерированный запрос.
Это вариант использования для сценического? Я застрял с необходимостью перемещаться по 2 переменным, которые существуют в запросе, который я делаю через
ActiveRecord
.
1 ответ
Привет, надеюсь, этот ответ поможет вам, это должен быть комментарий, а не ответ (еще недостаточно кармы для этого)
что вы можете сделать, так это создать представление в своей базе данных,
rails g migration my_new_view
ActiveRecord не дает нам никаких методов для создания представлений, поэтому вам придется делать это «вручную» или вы можете использовать для этого специальные драгоценные камни.
class MyNewView < ActiveRecord::Migration[5.2]
def change
reversible do |dir|
dir.up do
execute <<-SQL
CREATE OR REPLACE VIEW public.my_new_view AS
# your sql query here SELECT ....
SQL
end
dir.down do
execute <<-SQL
DROP VIEW IF EXISTS public.my_new_view;
SQL
end
end
end
end
теперь вы можете ссылаться на свою модель.
Остерегайтесь, что таблицы просмотра не будут отображаться в схеме по умолчанию, для их просмотра вы должны поместить их в свой application.rb:
config.active_record.schema_format = :sql
ваше здоровье.