【问题标题】:Rails 4 - Remove attributes from an already filtered Active Record queryRails 4 - 从已过滤的 Active Record 查询中删除属性
【发布时间】:2018-04-13 07:02:40
【问题描述】:

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

所需的数据在 html 所需的数据和 javascript 所需的数据之间有所不同。我正在使用gon 将数据注入到 js 脚本中。

我的应用程序运行良好,但 gon 正在注入 HTML(仅供参考,在正文标记下方的脚本中)数据过多,因为我只需要 Gon/Javascript 所需的 5 个属性中的 2 个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 重新使用为 HTML 创建的相同 @steps,但从中删除 3 个属性。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 activerecord gon


    【解决方案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 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多