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但它看起来仍然不够干燥,而且我仍然在不同的控制器上做同样的事情。
有什么方法可以让这看起来更好,而不是重复我自己吗?
这似乎是服务对象的一个很好的用途,而不是使用关注点在多个位置包含相同的代码。
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)