从控制器向序列化器发送过滤后的关联记录

时间:2015-04-11 14:57:42

标签: ruby-on-rails active-model-serializers

我正在使用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(我不认为我应该在模型上定义一个新的属性来过滤关联),我宁愿从社区获得一些反馈,而不是将此解决方案作为接受的答案发布

0 个答案:

没有答案