2017-02-03 1 views
0

Ich habe einige Code in einem meiner Controller wiederholt, die ich in einer Schleife konsolidieren möchte, aber ich kann keine klare Anweisung finden, wie dies zu tun ist, da dies ein einzigartiges scheint Anwendungsfall für gmaps4rails. Ich habe versucht, ein Array von Instanzvariablen zu erstellen, aber es schien nicht zu funktionieren! Der Code Ich mag würde konsolidieren:Instanz Variable Schleife in der Steuerung

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... 

Ich werde auch den Marker-Loader von meiner Karte JS in der Ansichtsdatei für eine gute Maßnahme umfassen,

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

Die gmaps4rails Marker Gebäude @hash Variablen weiterhin ihre einzelnen Schleifen durch alle 10 Wiederholungen über diesen ersten beiden hier angedeutet. Die einzigen zwei Variablen innerhalb dieser Hashes sind der Aufruf 'build_markers (@ rep #)' und der Aufruf 'chld = TP | 81DF08 | 000000', der die Initialen und die Farbe des Markers für jeden Benutzer anzeigt. Ich bin ein Anfänger, also könnte ich das alles von Anfang an falsch machen! Jeder Rat wird geschätzt. Vielen Dank!

EDIT ->

Mein konsolidierter Code, der wie das Hinzufügen eines „Marker“ -Spalte zu meiner Benutzertabelle so einfach endete als da dies die einzige hartcodiert war Variable, die Veränderung benötigt, in der Form von '# {store.user.marker}' in der URL Markierung auf der Karte:

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 

Antwort

0

Eine bessere Möglichkeit, diese Datensätze aus der db einfach zu holen zu tun ist, und speichern Sie die gesamte Sammlung in einem Instanzvariable.

@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 

dies zu tun:

@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") 

Ist für die Leistung schrecklich, da jede Zeile eine separate Datenbank-Abfrage erstellen wird. Wenn Sie neu bei Ruby sind, würde ich vorschlagen, etwas wie http://tryruby.org und lernen, wie man Arrays und Hashes und die Grundlagen zu manipulieren, bevor Sie versuchen, komplexere Probleme zu lösen.

+1

Das Codieren von IDs in Ihren Code ist ein wirklich schlechter Code-Geruch. Dies bedeutet, dass Sie den Code nicht testen können, da die IDs nacheinander von der Datenbank erstellt werden. Stattdessen sollten Sie darüber nachdenken, welche Ressourcen verfügbar sein sollten und eine sinnvolle Möglichkeit, sie zu filtern. – max

+0

Diese Methode begrenzt leider die Farben des Markers, da ich für jeden Benutzer dynamische Markerfarben auf der Karte haben muss. –

+1

Sie sollten den Benutzer mit 'store.user' erreichen können - Sie können die Farben in der Tabelle Benutzer speichern. Was Sie tun, ist nicht wirklich eine machbare Möglichkeit, um Apps zu bauen ... – max

Verwandte Themen