Рельсы имеют sh нулевую проверку - что лучше 'if-условие' и 'троичный оператор'? - PullRequest
0 голосов
/ 30 января 2020

у меня ниже га sh

instance_options[:param_page]
instance_options[:param_page][:comment_page]
instance_options[:param_page][:comment_per]

Мне нужно значение comment_page, comment_per Я сделал рефакторинг кода Но я не уверен, что лучше, ха sh проверка на ноль, дайте мне знать, лучшая проверка на ноль, если вы знать других

до

comment_page = 1
comment_per = 0
param_page = instance_options[:param_page]
if param_page
  comment_page = param_page[:comment_page].presence || comment_page
  comment_per = param_page[:comment_per].presence || comment_per
end

после

comment_page = instance_options[:param_page][:comment_page].present? ? instance_options[:param_page][:comment_page] : 1
comment_per = instance_options[:param_page][:comment_per].present? ? instance_options[:param_page][:comment_per] : 10

1 Ответ

1 голос
/ 30 января 2020

Вы go шаг вперед:

comment_page = instance_options.dig(:param_page, :comment_page).presence || 1
comment_per  = instance_options.dig(:param_page, :comment_per).presence || 0

Это будет go копаться в instance_options дважды, но стоимость будет тривиальной. Если вам нужно беспокоиться о типах (скажем, значение :comment_page может быть строкой), то вы можете добавить #to_i вызовов:

comment_page = (instance_options.dig(:param_page, :comment_page).presence || 1).to_i
comment_per  = (instance_options.dig(:param_page, :comment_per).presence || 0).to_i

или использовать reverse_merge ( так как это для установки значений по умолчанию):

param_page = instance_options[:param_page] || {}
param_page.reverse_merge(comment_page: 1, comment_per: 0)
# Then use param_page[:comment_page] and param_page[:comment_per] instead of two locals
...