найти класс модели массива в hash rails 4

#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 это_a Class . Поэтому вам следует использовать set_class == BlueModel