动态形成Ruby哈希的更好方法是什么?

时间:2015-12-29 11:43:48

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-3.2

我需要在检查值的存在后动态地形成哈希。我总是遇到这种情况并形成如下哈希,但我发现这非常难看,并想知道它们是否是一个棘手或更漂亮的方法:

以下是我如何形成它:

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)

更好的方式?

3 个答案:

答案 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}