Мое приложение предоставляет индекс навыков для пользователя. Навыки объединены в несколько таблиц, поэтому я использовал Arel для определения запроса.
Новым требованием является чтение этого индекса в формате JSON для предоставления другой услуги. URL-адрес каждого навыка также должен быть указан в ответе JSON, что не относится к исходному запросу. Поэтому я решил добавить вычисляемое поле в запрос Arel для генерации этой информации. Я пробовал несколько способов создания этого поля, но я не могу найти, как это сделать. Выражение поля должно содержать относительный URL-адрес, например:
"навыков / # {навыков [: id]}"
Но я не знаю, как реализовать это с Arel. Можете ли вы предложить решение?
Большое спасибо за вашу помощь!
Вот контроллер умений:
def index
@skills = Skill.joins(translated_skills).pgnd(current_playground).visible.search(params[:criteria]).
select(index_fields).order(order_by).paginate(page: params[:page], :per_page => paginate_lines)
respond_to do |format|
format.html # index.html.erb
format.json { render json: @skills }
format.csv { send_data @skills.to_csv }
format.xls # uses specific template to render xml
end
end
- - -
def names
Translation.arel_table.alias('tr_names')
end
def descriptions
Translation.arel_table.alias('tr_descriptions')
end
def external_descriptions
Translation.arel_table.alias('tr_external_descriptions')
end
def skills
Skill.arel_table
end
def translated_skills
skills.
join(names, Arel::Nodes::OuterJoin).on(skills[:id].eq(names[:document_id]).and(names[:document_type].eq("Skill")).and(names[:language].eq(current_language).and(names[:field_name].eq('name')))).
join(descriptions, Arel::Nodes::OuterJoin).on(skills[:id].eq(descriptions[:document_id]).and(descriptions[:document_type].eq("Skill")).and(descriptions[:language].eq(current_language).and(descriptions[:field_name].eq('description')))).
join(external_descriptions, Arel::Nodes::OuterJoin).on(skills[:id].eq(external_descriptions[:document_id]).and(external_descriptions[:document_type].eq("Skill")).and(external_descriptions[:language].eq(current_language).and(external_descriptions[:field_name].eq('external_description')))).
join_sources
end
def index_fields
[skills[:id], skills[:code], skills[:name], skills[:description], skills[:status_id], skills[:updated_by], skills[:updated_at], skills[:responsible_id], skills[:business_object_id],
names[:translation].as("translated_name"),
descriptions[:translation].as("translated_description"),
external_descriptions[:translation].as("translated_external_description")]
end
def order_by
[skills[:created_at].asc]
end