2011-05-21 4 views
0

Я выполняю вызовы API, которые условно возвращают пару разных элементов. Мой код:Ruby: Лучший способ разобрать элемент условного массива

if array['productId'] 
    value = array['productId'][0] 
end 

Я чувствую, что есть более лаконичный способ сделать это. Некоторая рубиновая магия.

+2

Я думаю, что это хэш, а не массив. Кроме того, я не уверен, что есть что-то более сжатое, чем то, что у вас есть: «Если элемент существует, чем взаимодействовать с ним более определенным образом». Вы не получите гораздо более сжатый, чем условный, если вы не будете делать этот процесс снова и снова и выиграете от цикла. – Matchu

+0

В основном я создаю объект и сохраняю его в Active Record. когда модель имеет 10+ полей, для вывода данных из этих данных не требуется 10 различных условных выражений. Также см. Мой ответ на SpyrosP – JBlake

ответ

4

Лучший способ:

value = array['productId'][0] if array['productId'] 

Однако массив [ 'PRODUCTID'] [0] не рубин естественно. Из чего состоит ваш массив?

+0

Его ответ JSON от API eBay. Я прочитал строку и использую JSON.parse. Я думаю, что Matchu может быть прав, что я действительно имею дело с хэшем. В таком случае, я вообще делаю это неправильно? По сути, я хватаю пару ключевых полей данных из JSON и сохраняю их в своей базе данных ActiveRecord в форме модели продукта. (название, цена, галерея_изображения и т. д.). Мне нравится решение, представленное ... держит все на одной линии, я ненавижу гнездование вещей. – JBlake

+0

'value = array ['productId']. Try (: [], 0)' –

0

Вы можете использовать трехкомпонентной:

value = array['productId'].nil? ? nil : array['productId'][0] 
1

Я не уверен, что вы используете value только временно или на самом деле используете его позже, и что вы хотите делать с value, когда условие не выполняется. Если вы хотите вернуть nil для отсутствующих ключей, то

array['productId'].to_a[0] 

может работать. В противном случае ответ SpyrosP будет лучшим.

0

Ваш код выглядит нормально; это возможно, чтобы быть немного короче ...

value = (t = x['productId']) && t[0] 
+0

как насчет использования try? – Blankman

1

Это может быть немного педантичным, но чтобы убедиться, что он работает во всех обстоятельствах вы не должны проверить «не-ноль», а то, что она индексируется; что-то вроде этого:

value = array['productId'][0] if array['productId'].is_a? Array 

Или еще лучше:

value = array['productId'][0] if array['productId'].respond_to? '[]' 

В противном случае ваш код будет ошибкой, если array['productId'] == 2 (который с другой стороны, представляется разумным, учитывая ключ, используемый - я пошел бы product_ids вместо этого) ,

0

Использование возможно модель Ick, немногословный и явной:

value = array['productId'].maybe[0] 
0

Хотя я думаю, что ваш код нормально (хотя я бы предпочел вариант однострочный SpyrosP в), у вас есть несколько возможностей:

  • Rails имеет Object#try, который позволил бы вы ни array['productId'].try(:[], 0) или array['productId'].try(:at, 0).

  • Некоторые люди любят драгоценный камень andand, который определяет Object#andand и используется как array['productId'].andand[0].

+0

Примечание: метод «try» добавлен в Rails через ActiveSupport и не будет работать в обычном Ruby: http://guides.rubyonrails.org/active_support_core_extensions.html#try – brookr

+0

Следовательно, «Rails имеет объект # try»;) –

0

Ха, я обожаю все варианты здесь. Но поскольку я не видел, что я использую больше всего, я добавлю еще один!

value = array['productId'] && array['productId'].first

(я предпочитаю .first к [0], потому что он читает немного лучше)

Это предполагает, что вы будете иметь массив в array['productId'], который является правильный способ сделать это (а не тип- проверка).

В противном случае, самый большой различию между этим и вашим исходным кодом, что это приводит к value имея nil, возложенную на него, если массив не имеет ничего, в то время как ваши оригинальные результаты в value не определено (что может привести к ошибкам , в зависимости от того, как вы используете его по дороге).

Надеюсь, что это поможет!

Смежные вопросы