是否有在 RAILS API 控制器索引操作中应用过滤器哈希的 DRY 方法?

beg*_*din 5 ruby-on-rails dry rails-api json-api

根据 JSON API 规范,我们应该使用过滤器查询参数来过滤控制器中的记录。filter 参数实际上是什么并没有真正指定,但由于它应该能够包含多个搜索条件,显而易见的事情是使用散列。

问题是,我似乎经常在不同类型记录的控制器操作中重复自己。

以下是仅包含 id 列表(以获取多个特定记录)的过滤器的情况。

def index
  if params[:filter] and params[:filter][:id]
    ids = params[:filter][:id].split(",").map(&:to_i)
    videos = Video.find(ids)
  else
    videos = Video.all
  end
  render json: videos
end
Run Code Online (Sandbox Code Playgroud)

对于嵌套属性检查,我想我可以使用fetchorandand但它看起来仍然不够干燥,而且我仍然在不同的控制器上做同样的事情。

有什么方法可以让这看起来更好,而不是重复我自己吗?

tom*_*non 4

这似乎是服务对象的一个​​很好的用途,而不是使用关注点在多个位置包含相同的代码。

class CollectionFilter
    def initialize(filters={})
        @filters = filters
    end

    def results
        model_class.find(ids)
    end

    def ids
        return [] unless @filters[:id]
        @filters[:id].split(",").map(&:to_i)
    end

    def model_class
        raise NotImplementedError
    end
end
Run Code Online (Sandbox Code Playgroud)

CollectionFilter您可以如上所述编写泛型,然后子类化以添加特定用例的功能。

class VideoFilter < CollectionFilter
    def results
        super.where(name: name)
    end

    def name
        @filters[:name]
    end

    def model_class
        Video
    end
end
Run Code Online (Sandbox Code Playgroud)

您可以在控制器中使用它,如下所示;

def index
    videos = VideoFilter.new(params[:filter]).results
    render json: videos
end
Run Code Online (Sandbox Code Playgroud)