Rails 4 - удаление атрибутов из уже отфильтрованного запроса Active Record

В одном из моих контроллеров ruby ​​на Rails 4 у ​​меня есть метод, который вводит данные, необходимые для View.

Необходимые данные варьируются между данными, необходимыми для HTML, и данными, необходимыми для JavaScript. Я использую GON для ввода данных в сценарии JS.

Мое приложение работает нормально, но gon вводит в HTML (FYI в скрипте чуть ниже тега body) слишком много данных, поскольку мне нужно только для Gon/Javascript 2 из 5 атрибутов, необходимых для представления HTML. (Причина, по которой вы хотите, чтобы: поскольку я загружаю много объектов, разница в байтах для файла HTML очень значительна)

def inject_deal_steps_data
      # Used in html view     
      @steps = @deal.steps.select(:attribute1,
                                  :attribute2,
                                  :attribute3,
                                  :attribute4,                                             
                                  :attribute5). order(attribute4: :asc)

      # Used in js file
      gon.push( { deal_steps: @steps } ) if @steps
    end

Я пытался использовать такие методы, как unscope, как показано ниже, но это не сработало.

def inject_deal_steps_data
          # Used in html view     
          @steps = @deal.steps.select(:attribute1,
                                      :attribute2,
                                      :attribute3,
                                      :attribute4,                                             
                                      :attribute5). order(attribute4: :asc)

          # Used in js file
          gon.push( { deal_steps: @steps.unscope(:attribute1,:attribute3,:attribute4 } ) if @steps
        end

Я не хочу создавать другой новый выбор, как показано ниже, так как он создает новый запрос / попадание в базу данных.

@steps = @deal.steps.select(:attribute1,
                                      :attribute2,
                                      :attribute3,
                                      :attribute4,                                             
                                      :attribute5). order(attribute4: :asc)
gon.push( { deal_steps: @deal.steps.select(:attribute2,:attribute5) } ) if @deal.steps

Я хочу повторно использовать для GON те же самые @steps, созданные для HTML, но удалить из него 3 атрибута.

1 ответ

Решение

Ты можешь использовать as_json контролировать то, что будет выставлено to_json, gon звонки to_json внутренне, чтобы преобразовать ruby Возражать javascript объект и выставляет его на вид.

Попробуйте следующее:

def inject_deal_steps_data
  # Used in html view     
  @steps = @deal.steps.select(
    :attribute1,
    :attribute2,
    :attribute3,
    :attribute4,                                             
    :attribute5
  ).order(attribute4: :asc)

  # Used in js file
  gon.push({ 
    deal_steps: @steps.as_json(except: [:attribute1,:attribute3,:attribute4])
  }) if @steps
end

Обзор as_json для дополнительной информации.

Другие вопросы по тегам