gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:06:30 25 4
gpt4 key购买 nike

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

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

最佳答案

如果照片是 ActiveRecord 对象,您应该使用 scope为您需要的确切数据生成适当的查询。否则,Rails 将加载所有照片而不是您需要的子集。假设您的照片记录只有一个标签属性,您可以执行如下操作:

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

在您的 Controller 中,您只需要调用该作用域,因为如果没有提供参数,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

关于ruby-on-rails - 在 Rails 中分配和重用变量 - 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38273988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com