控制器内的实例变量循环

Instance Variable loop inside the controller

我的一个控制器中有一些重复的代码,我想将它们合并到一个循环中,但我找不到关于如何这样做的任何明确说明,因为这似乎是 gmaps4rails 的一个独特用例.我尝试创建一个实例变量数组,但它似乎没有用!我要合并的代码:

stores_controller.rb -->

class StoresController < ApplicationController

    def map
      @rep1 = Store.where(:user_id => "1")
      @rep2 = Store.where(:user_id => "10")
      @rep3 = Store.where(:user_id => "11")
      @rep4 = Store.where(:user_id => "12")
      @rep5 = Store.where(:user_id => "13")
      @rep6 = Store.where(:user_id => "14")
      @rep7 = Store.where(:user_id => "15")
      @rep8 = Store.where(:user_id => "16")
      @rep9 = Store.where(:user_id => "17")
      @repA = Store.where(:user_id => "18")

      @hash1 = Gmaps4rails.build_markers(@rep1) do |store, marker|
        marker.lat store.lat
        marker.lng store.long
        marker.title store.name
        marker.infowindow "#{store.store_infowindow}"
        marker.picture({
           :url => "//chart.apis.google.com/chart?chst=d_map_pin_letter&chld=TP|81DF08|000000",
           :width   => 52,
           :height  => 32
        })

      end
      @hash2 = Gmaps4rails.build_markers(@rep2) do |store, marker|
        marker.lat store.lat
        marker.lng store.long
        marker.title store.name
        marker.infowindow "#{store.store_infowindow}"
        marker.picture({
           :url => "//chart.apis.google.com/chart?chst=d_map_pin_letter&chld=BS|267AD2|D9E1FF",
           :width   => 52,
           :height  => 32
        })
      end
      @hash3 = etc, etc, etc...

我还将在视图文件中包含我的地图 JS 中的标记加载器,以备不时之需,

map.html.erb -->

markers = handler.addMarkers(<%=raw @hash1.to_json %>), handler.addMarkers(<%=raw @hash2.to_json %>),
          handler.addMarkers(<%=raw @hash3.to_json %>), handler.addMarkers(<%=raw @hash3.to_json %>),
          handler.addMarkers(<%=raw @hash4.to_json %>), handler.addMarkers(<%=raw @hash5.to_json %>),
          handler.addMarkers(<%=raw @hash6.to_json %>), handler.addMarkers(<%=raw @hash7.to_json %>),
          handler.addMarkers(<%=raw @hash8.to_json %>), handler.addMarkers(<%=raw @hash9.to_json %>),
          handler.addMarkers(<%=raw @hashA.to_json %>);

gmaps4rails 标记构建 @hash 变量继续其各自的循环,通过所有 10 个代表,超出此处指示的前两个代表。这些散列中仅有的两个变量是 'build_markers(@rep#)' 调用和 'chld=TP|81DF08|000000' 调用,它们指示每个用户的标记的首字母和颜色。我是初学者,所以据我所知,我可能从一开始就完全错误地做这件事!任何建议表示赞赏。谢谢!

编辑 -->

我的合并代码,最终就像向我的用户 table 添加一个 "Marker" 列一样简单,因为这是唯一需要更改的硬编码变量,形式为 ' #{store.user.marker}' 在地图标记内 URL:

stores_controller.rb -->

def map
  @stores = Store.all
  @hash = Gmaps4rails.build_markers(@stores) do |store, marker|
    marker.lat store.lat
    marker.lng store.long
    marker.title store.name
    marker.infowindow "#{store.store_infowindow}"
    marker.picture({
       :url => "//chart.apis.google.com/chart?chst=d_map_pin_letter&chld=#{store.user.marker}",
       :width   => 52, :height  => 32
    })
  end
  respond_to do |format|
    format.html
    format.json { render json: @hash }
  end
end

一个更好的方法是简单地从数据库中获取记录并将整个集合存储在一个实例变量中。

@stores = Store.where(user_id: [1, 2, 3])

@markers = Gmaps4rails.build_markers(@stores) do |store, marker|
  marker.lat store.lat
  marker.lng store.long
  marker.title store.name
  marker.infowindow "#{store.store_infowindow}"
  # if they need different pictures handle it in the model
  marker.picture({
           :url => "//chart.apis.google.com/chart?chst=d_map_pin_letter&chld=TP|81DF08|000000",
           :width   => 52,
           :height  => 32
  })
end

这样做:

  @rep1 = Store.where(:user_id => "1")
  @rep2 = Store.where(:user_id => "10")
  @rep3 = Store.where(:user_id => "11")
  @rep4 = Store.where(:user_id => "12")
  @rep5 = Store.where(:user_id => "13")
  @rep6 = Store.where(:user_id => "14")
  @rep7 = Store.where(:user_id => "15")

对性能来说太糟糕了,因为每一行都会创建一个单独的数据库查询。如果您是 ruby 的新手,我建议您做一些类似 http://tryruby.org 的事情,并在尝试解决更复杂的问题之前学习如何操作数组和哈希以及基础知识。