2016-07-08 35 views
6

我一直在使用相同的模式來返回json代碼(請參閱下面的示例)。我正在收集照片並將其存儲在變量中。如果標籤參數存在,我會得到一個更具體的集合並將其重新分配給同一個變量。然後將其作爲json返回。什麼是更好的設計模式來實現相同的目標?在Rails中分配和重用變量 - 設計模式

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

它可能是什麼樣的條件?也許範圍可能是一個很好的解決方案? – Albin

+0

我應該指定collection_of_photos是散列數組。條件是選擇具有匹配標記的照片。 @faraz提供的答案解決了這個問題。在處理ActiveRecord對象時,我一定會考慮將來使用的範圍。 –

回答

5

如果照片是ActiveRecord對象應使用scope爲您生成所需的確切數據適當的查詢。否則,Rails將加載所有的照片,而不是你需要的子集。假設你的照片記錄了一個標籤屬性,你可以做類似如下:

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

在你的控制你只需要調用自ActiveRecord的作用域範圍返回#all範圍,如果沒有提供參數:

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

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

現在說你不處理ActiveRecord對象。假設你有一個散列的數組:

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

您可以創建一個輔助方法來進行過濾:

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

這非常有幫助!我正在處理哈希數組,所以第二個答案是正確的。感謝您解釋兩種情況! –