Как создать вычисляемое поле с помощью Arel? - PullRequest
0 голосов
/ 03 апреля 2020

Мое приложение предоставляет индекс навыков для пользователя. Навыки объединены в несколько таблиц, поэтому я использовал 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
...