Rails 4 - 从已过滤的 Active Record 查询中删除属性

Rails 4 - Remove attributes from an already filtered Active Record query

在 Rails 4 控制器上的一个 ruby 中,我有一种方法可以将必要的数据注入视图。

html 所需的数据和 javascript 所需的数据之间存在差异。我正在使用 gon 将数据注入 js 脚本。

我的应用程序工作正常,但 gon 正在注入 HTML(仅供参考,在 body 标签下方的脚本中)太多数据,因为我只需要 Gon/Javascript HTML 视图所需的 5 个属性中的 2 个。 (希望如此的原因:当我加载很多对象时,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

我不想像下面那样创建另一个新选择,因为它会在数据库上创建一个新的 request/hit。

@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 重新使用为 HTML 创建的相同@steps,但从中删除了 3 个属性。

您可以使用 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 了解更多信息。