Я открываю для себя Arel и немного озадачен тем, как вернуться к объектам ActiveRecord, используемым по умолчанию в моем приложении RoR 5.2.
Первоначально мой набор данных индекса бизнес-правил был определен как:
@business_rules = BusinessRule.pgnd(current_playground_scope).
search(params[:criteria]).order("hierarchy ASC").
paginate(page: params[:page], :per_page => paginate_lines)
Теперь столбцы Name и Description предоставляются таблицей Translations, что делает запросы немного более сложными. Вот где приходит Арель:
names = Translation.arel_table.alias('tr_names')
descriptions = Translation.arel_table.alias('tr_descriptions')
rules = BusinessRule.arel_table
translated_rules = rules.
join(names, Arel::Nodes::OuterJoin).on(rules[:id].eq(names[:document_id]).and(names[:language].eq(user_language).and(names[:field_name].eq('name')))).
join(descriptions, Arel::Nodes::OuterJoin).on(rules[:id].eq(descriptions[:document_id]).and(descriptions[:language].eq(user_language).and(descriptions[:field_name].eq('description'))))
rules_extract = translated_rules.project(Arel.star)
sql = rules_extract.to_sql
@rules_index = ActiveRecord::Base.connection.execute(sql)
#suggestions for better organising Arel's tree are welcome
Метод to_sql предоставляет удовлетворительный запрос SQL, но результат метода execute возвращает класс PG :: Result, где я ожидаю ActiveRecord_Relation.
Читая вокруг, я многое узнал о возможностях Арела, но мне все еще не хватает ссылки, чтобы вернуть ее на работу в моем индексном представлении.
Спасибо за помощь!