2016-07-08 29 views
6

Json kodunu döndürmek için aynı modeli kullanıyorum (aşağıdaki örneğe bakın). Bir fotoğraf koleksiyonu alıyorum ve değişkende saklıyorum. Etiket param mevcutsa, daha spesifik bir koleksiyon alıyorum ve aynı değişkene yeniden atacağım. Sonra json olarak geri dönüyor. Aynı şeyi elde etmek için daha iyi bir tasarım deseni ne olurdu? Fotoğraf iseRails - tasarım deseninde değişkenleri atama ve yeniden kullanma

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

o şartlarda ne tür olabilir:

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

Sen filtreleme gerçekleştirmek için bir yardımcı yöntemini oluşturabilirsiniz: Eğer sağlamalarının bir dizi var ki? Belki bir kapsam güzel bir çözüm olabilir mi? – Albin

+0

Koleksiyon_of_photos'un bir dizi karma olduğunu belirtmeliydim. Durum, eşleşen etiketle fotoğraf seçmektir. Sağlanan @faraz yanıtı sorunu çözmektedir. ActiveRecord nesnelerini ele alırken kesinlikle ileride kullanmak için kapsamları inceleyeceğim. –

cevap

5

ActiveRecord size ihtiyacınız olan tam veri için uygun sorgu oluşturmak için bir scope kullanmalıdır nesneleri. Aksi takdirde Raylar, ihtiyacınız olan alt kümenin yerine tüm fotoğrafları yükler. Eğer hiçbir parametre sağlanırsa ActiveRecord kapsamları beri kapsamı bir #all kapsamını iade O aramayı gereken tek yazıyı, denetleyici olarak

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

: Fotoğraflarınızı kayıtları tek bir etiket niteliğini varsayarsak, aşağıdaki gibi bir şey yapabilirsiniz:

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

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

Şimdi ActiveRecord nesneler ile ilgili değiliz derler.

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

Bu çok faydalı! Ben hash dizisi ile uğraşıyorum, bu yüzden ikinci cevap doğru noktadaydı. Her iki durumu açıkladığınız için teşekkür ederiz! –