Существует ли способ получить набор всех Моделей в Вашем приложении для направляющих?

Будьте в курсе запросов, которые отправляются сразу после обновления запроса токена со старым действительным токеном. Я рекомендую использовать перехватчик и ставить в очередь все запросы, отправленные после refreshToken. Подождите, пока придет refreshToken, а затем отправьте запросы в очередь.

Другой способ - перехватить ошибку 401 -> запрос на копирование -> refreshToken -> отправить копию запроса.

194
задан tronerta 22 February 2019 в 12:13
поделиться

5 ответов

РЕДАКТИРОВАНИЕ: Посмотрите на комментарии и другие ответы. Существуют более умные ответы, чем этот! Или попытайтесь улучшить этого как общественную Wiki.

Модели не регистрируют себя к объекту шаблона, таким образом, не, направляющие не имеют списка моделей.

, Но Вы могли все еще посмотреть в содержании каталога моделей Вашего приложения...

Dir.foreach("#{RAILS_ROOT}/app/models") do |model_path|
  # ...
end

РЕДАКТИРОВАНИЕ: Другая (дикая) идея состояла бы в том, чтобы использовать отражение Ruby для поиска каждого классы, который расширяет ActiveRecord:: Основа. Не знайте, как можно перечислить все классы хотя...

РЕДАКТИРОВАНИЕ: Только для забавы, я нашел способ перечислить все классы

Module.constants.select { |c| (eval c).is_a? Class }

РЕДАКТИРОВАНИЕ: Наконец преуспевший список всех моделей, не смотря на каталоги

Module.constants.select do |constant_name|
  constant = eval constant_name
  if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
    constant
  end
end

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

class Class
  def extend?(klass)
    not superclass.nil? and ( superclass == klass or superclass.extend? klass )
  end
end

def models 
  Module.constants.select do |constant_name|
    constant = eval constant_name
    if not constant.nil? and constant.is_a? Class and constant.extend? ActiveRecord::Base
    constant
    end
  end
end
97
ответ дан 6 revs, 2 users 98% 23 November 2019 в 05:22
поделиться

Это, кажется, работает на меня:

  Dir.glob(RAILS_ROOT + '/app/models/*.rb').each { |file| require file }
  @models = Object.subclasses_of(ActiveRecord::Base)

направляющие только загружают модели, когда они используются, таким образом, строка Dir.glob "требует" всех файлов в каталоге моделей.

, После того как у Вас есть модели в массиве, можно сделать то, что Вы думали (например, в поле зрения кодируйте):

<% @models.each do |v| %>
  <li><%= h v.to_s %></li>
<% end %>
17
ответ дан bhousel 23 November 2019 в 05:22
поделиться

С направляющие 6 , Zetiwerk стал загрузчиком кода по умолчанию.

Для нетерпеливой загрузки, попробуйте:

Zeitwerk::Loader.eager_load_all

Затем

ApplicationRecord.descendants
2
ответ дан 23 November 2019 в 05:22
поделиться

На случай, если кто-нибудь наткнется на это, у меня есть другое решение, не полагаясь на чтение dir или расширение класса Class...

ActiveRecord::Base.send :subclasses

Это вернет массив классов. Тогда можно сделать

ActiveRecord::Base.send(:subclasses).map(&:name)
115
ответ дан 23 November 2019 в 05:22
поделиться

В одной строке: Dir ['app / models / \ *. Rb '] .map {| f | File.basename (f,'. * '). camelize.constantize}

11
ответ дан 23 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: