我需要在检查值的存在后动态地形成哈希。我总是遇到这种情况并形成如下哈希,但我发现这非常难看,并想知道它们是否是一个棘手或更漂亮的方法:
以下是我如何形成它:
args = {}
args[:pagination_token] = params[:pagination_token] if params[:pagination_token]
args[:sort_by] = params[:sort_by] if params[:sort_by]
args[:sort_direction] = params[:sort_direction] if params[:sort_direction]
args[:pagination_direction] = params[:pagination_direction] if params[:pagination_direction]
args[:limit] = params[:limit] if params[:limit]
users_list, next_pagination_token, previous_pagination_token = current_application.paginated_users(args)
更好的方式?
答案 0 :(得分:4)
你可以这样使用slice
:
args = params.slice(:pagination_token, :sort_by, :sort_direction, :pagination_direction, :limit)
修改强>:
由于问题的主题是“在Ruby中”,并且上述方法仅在您包含ActiveSupport时才有效。事实上,在这种情况下OP会使用Rails。对于那些想在Ruby中做的人可以做:
valid_params = [:pagination_token, :sort_by, :sort_direction, :pagination_direction, :limit]
args = params.select{ |k| valid_params.include? k }
答案 1 :(得分:1)
使用ActiveSupport' Hash#slice
:
args = params.slice(:pagination_token, :sort_by, :sort_direction, :pagination_direction, :limit)
答案 2 :(得分:0)
这是另一种方法:
h = {
pagination_token: 100,
sort_by: 200,
# sort_direction: 300,
pagination_direction: 400,
limit: 500,
some_other_value: 500,
}
keys = [:pagination_token, :sort_by, :sort_direction]
p [keys, h.values_at(*keys)].transpose.to_h.reject {|_,v| v.nil?}
#=> {:pagination_token=>100, :sort_by=>200}