实例控制器内部的可变循环

时间:2017-02-03 18:17:42

标签: ruby-on-rails gmaps4rails

我在我的一个控制器中有一些重复的代码,我想整合到一个循环中,但我找不到任何关于如何这样做的明确说明,因为这似乎是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 - &gt;

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 %>);

构建@hash变量的gmaps4rails标记继续它们各自的循环,超过这里指出的前两个之后的所有10个代表。这些哈希中唯一的两个变量是'build_markers(@ rep#)'调用和'chld = TP | 81DF08 | 000000'调用,它表示每个用户的标记的首字母和颜色。我是初学者,所以我知道从一开始我就可以完全做错了!任何建议表示赞赏。谢谢!

编辑 - &gt;

我的整合代码,最终就像在我的用户表中添加“标记”列一样简单,因为这是唯一需要更改的硬编码变量,格式为'#{store.user.marker} '在地图标记网址中:

stores_controller.rb - &gt;

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

1 个答案:

答案 0 :(得分:0)

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

@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这样的事情,并在尝试解决更复杂的问题之前学习如何操作数组和哈希以及基础知识。