我一直在使用相同的模式返回json代码(参见下面的示例)。我正在收集照片并将其存储在变量中。如果存在标签参数,我将获得更具体的集合并将其重新分配给同一变量。然后把它作为json返回。什么是更好的设计模式来实现同样的事情?
photos = collection_of_photos
if params[:tag]
photos = photos.find_all {|photo| some condition}
end
render json: photos
答案 0 :(得分: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