在Rails中分配和重用变量 - 设计模式

时间:2016-07-08 19:22:03

标签: ruby-on-rails ruby

我一直在使用相同的模式返回json代码(参见下面的示例)。我正在收集照片并将其存储在变量中。如果存在标签参数,我将获得更具体的集合并将其重新分配给同一变量。然后把它作为json返回。什么是更好的设计模式来实现同样的事情?

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

1 个答案:

答案 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