我正在使用AMS处理Rails应用程序。我有物品和类别,有一对多的关系。可以在控制器中过滤项目。这适用于Items索引操作,因为我可以将过滤后的数组发送到序列化程序:
items_controller.rb
class ItemsController < ApplicationController
def index
items = Item.all
if maxprice = params[:maxprice]
items = items.where('price <= ?', (maxprice.to_i))
end
render json: items, each_serializer: ItemIndexSerializer, status: 200
end
end
问题在于类别显示操作,我想要发回相关项目,并且仍然能够在控制器中过滤它们。我发现了一个非常脏的方法,通过将maxprice参数发送到序列化程序并在之后过滤项目,如
categories_controller.rb
class CategoriesController < ApplicationController
def show
category = Category.find(params[:id])
render json: category, serializer: CategoryShowSerializer, status: 200, maxprice: params[:maxprice]
end
end
category_show_serializer.rb
class CategoryShowSerializer < ActiveModel::Serializer
has_many :items, serializer: ItemIndexSerializer
def items
items = object.items
if maxprice = @options[:maxprice]
items = items.where('price <= ?', (maxprice.to_i))
end
end
end
然而,对于这样一个简单的场景(在我的真实应用程序中不是这种情况),这可能是正常的,但我希望能够在Categories控制器中进行过滤并使用过滤后的产品发送类别对象数组到序列化器。有关如何做到这一点的任何想法?
修改的
我正在使用的临时修复是在Category模型上定义attr_accessor :filtered_items
,然后将过滤的项目数组分配给控制器中的category.filtered_items
。通过这种方式,我可以在序列化程序中将项目定义为object.filtered_items
。
这有效,但仍然感觉有点hacky(我不认为我应该在模型上定义一个新的属性来过滤关联),我宁愿从社区获得一些反馈,而不是将此解决方案作为接受的答案发布