2016-07-08 114 views
6

Ho utilizzato lo stesso modello per restituire il codice JSON (vedere l'esempio di seguito). Ricevo una raccolta di foto e la memorizzo nella variabile. Se il parametro tag è presente, ricevo una raccolta più specifica e la riassegno alla stessa variabile. Quindi restituirlo come json. Quale sarebbe uno schema di progettazione migliore per ottenere la stessa cosa?Assegnazione e riutilizzo di variabili in Rails - modello di progettazione

photos = collection_of_photos 
if params[:tag] 
photos = photos.find_all {|photo| some condition} 
end 
render json: photos 
+0

che tipo di condizioni potrebbe essere? Forse uno scope potrebbe essere una buona soluzione? – Albin

+0

Avrei dovuto specificare che collection_of_photos è un array di hash. La condizione è selezionare le foto con il tag corrispondente. La risposta fornita da @faraz risolve il problema. Cercherò sicuramente gli ambiti per l'uso futuro quando si tratta di oggetti ActiveRecord. –

risposta

5

Se le foto sono ActiveRecord oggetti è necessario utilizzare un scope per generare la query appropriata per i dati esatti necessari. Altrimenti, Rails caricherà tutte le foto invece del sottoinsieme di cui hai bisogno. Supponendo che le vostre foto record hanno un singolo attributo di tag, si può fare qualcosa di simile al seguente:

class Photo < ApplicationRecord 
    scope :with_tag, (tag) -> { where(tag: tag) } 
end 

Nel vostro controller avresti solo bisogno la chiamata che portata dal ambiti di ActiveRecord restituire un #all ambito se sono forniti senza parametri:

render json: Photo.with_tag(params[:tag]) 

# Equivalent when params[:tag] is nil 
render json: Photo.all 

Ora dicono che non a che fare con oggetti ActiveRecord. Diciamo che hanno una vasta gamma di hash:

photos = [{ name: '1.jpg', tag: 'flower'}, ... ] 

È possibile creare un metodo di supporto per eseguire il filtraggio:

class PhotosController < ApplicationController 
    def index 
    photos = [{ name: '1.jpg', tag: 'flower'}, ... ] 
    render json: select_photos_by_tag(photos, params[:tag]) 
    end 

    private 

    def select_photos_by_tag(photos, tag) 
    if tag 
     photos.select { |photo| photo[:tag] == tag } 
    else 
     photos 
    end 
    end 
end 
+0

questo è molto utile! Ho a che fare con una serie di hash, quindi la seconda risposta è stata giusta. Grazie per aver spiegato entrambe le situazioni! –