现在我使用以下内容确保我的所有参数值都不是
start, limit = params[:start] ||= 0, params[:limit] ||= 300
sort, dir = params[:sort] ||= 'id', params[:dir] ||= 'ASC'
但我想使用像
这样的东西params[:start], params[:limit] ||= 0, 300
params[:sort], params[:dir] ||= 'id', 'ASC'
但我收到错误语法错误,意外的tOP_ASGN,期待' ='
有人有更好的方法吗?
答案 0 :(得分:3)
怎么样:
params = {start: 0, limit: 300, sort: 'id', dir: 'ASC'}.merge(params)
更新
如果params
没有指定的密钥,则上述代码将有效,但是,例如params[:key]
存在且关联值为nil,结果为nil。要解决这个问题,你可以这样做:
params = {start: 0, limit: 300, sort: 'id', dir: 'ASC'}.merge(params) {|_,old,new| new || old }
答案 1 :(得分:1)
编写代码如下:
start, limit = params[:start] ||= 0, params[:limit] ||= 300
sort, dir = params[:sort] ||= 'id', params[:dir] ||= 'ASC'
或:
params[:start], params[:limit] ||= 0, 300
params[:sort], params[:dir] ||= 'id', 'ASC'
看似可取,因为它“紧凑”,“简洁”或“简洁”,它转向迎面而来的车道,变得难以理解。
分散逻辑是可以的,因为我们的目标是让那些可能必须在周六晚上3:00维护它的人理解我们的代码。
而不是上述内容,我将它分开:
start = params[:start] ||= 0 # explain why 0
limit = params[:limit] ||= 300 # explain why 300
sort = params[:sort] ||= 'id' # explain why 'id'
dir = params[:dir] ||= 'ASC' # explain why 'ASC'
或:
start, limit, sort, dir = params.values_at(:start, :limit, :sort, :dir)
start ||= 0 # explain why 0
limit ||= 300 # explain why 300
sort ||= 'id' # explain why 'id'
dir ||= 'ASC' # explain why 'ASC'
在上述任何一种情况下,我都会更进一步定义使用符号名称的常量,而不是硬编码的“魔术”值。
你可能获得一个毫秒的执行速度来编写你想要的代码,如果你可以让它工作,但是你可能会损失数秒或几分钟的维护时间,并且使用你的代码激怒同事或其他人,因为它不是正常的,标准的或预期的,所以不要去那里。
答案 2 :(得分:0)
我最终这样做了,这对我来说简洁易懂。 我需要将params作为一个整体传递,因为我可能还需要其他值来构建我的选择。 变量名称不言而喻,它们最终可能会出现在yaml配置文件中,并提供所需的解释。
def generic_data_getter (class_name, params, start=0, limit=300, sort='id', dir='ASC')
selection = build_selection(class_name, params)
data = class_name.where(selection).offset(start).limit(limit).order("#{sort} #{dir}")
{:success => true, :totalCount => data.except(:offset, :limit, :order).count, :result => data.to_hash}
end
def get_data_for (class_name, params)
generic_data_getter(class_name, params, params[:start], params[:limit], params[:sort], params[:dir])
end