#ruby-on-rails #arrays #ruby #ruby-on-rails-4 #hash
#ruby-on-rails #массивы #ruby #ruby-on-rails-4 #хэш
Вопрос:
Я пытаюсь выяснить, КАКАЯ модель осталась в массиве, чтобы я мог создавать условные операторы, используя эту модель.
set_hash = {
some_array_one: RedModel.some_scope,
some_array_two: BlueModel.some_scope,
some_array_three: GreenModel.some_scope
}
Предполагая, что этот хэш имеет
some_array_one.count = 0,
some_array_two.count = 5,
some_array_three.count = 0,
Тогда ответ на set_class должен быть равен: BlueModel
Вот как я пытался найти этот ответ
set_class = set_hash.reject{|k, v| v.count.zero?}.map{|k, v| v.first.class.name}
Однако то, что я получаю, это:
["BlueModel"]
Как мне придать константу этой строке в массиве (вероятно, неправильный термин.)
Когда я пытаюсь использовать constantize, я получаю эту ошибку:
NoMethodError: undefined method `constantize' for ["Item"]:Array
Ответ №1:
Как мне придать константу этой строке в массиве (вероятно, неправильный термин.)
На самом деле существует метод с именем constantize
, который делает именно то, на что похоже, что он делает:
"BlueModel".constantize
#=> BlueModel
На самом деле, это строка только потому, что вы вызываете v.first.class.name
, удалите name
вызов, и вы получите саму модель.
set_class = set_hash.reject{ |k, v| v.count.zero?}.map{ |k, v| v.first.class.name }.map(amp;:constatize).first
set_class = set_hash.reject{ |k, v| v.count.zero?}.map{ |k, v| v.first.class }.first
Комментарии:
1. Да, но это дает мне этот NoMethodError: неопределенный метод `constantize’ для [«Item»]:Array
2. @NothingToSeeHere либо добавить
set_class.map(amp;:constantize).first
, либоset_class.first.constantize
3. @NothingToSeeHere Я добавил несколько опций, я бы определенно выбрал последнюю
4. @NothingToSeeHere Я не понимаю, что не позволяет вам вызывать
kind_of?
?5. @NothingToSeeHere
set_class == BlueModel
=>true
, ноset_class
это_aClass
. Поэтому вам следует использоватьset_class == BlueModel