Могу ли я загрузить некоторые приборы перед другими в Rails, чтобы просмотреть их в таблице соединений? - PullRequest
1 голос
/ 03 октября 2019

Приложение My Rails (4.2.11.1) имеет модель User и модель Role. В моих приборах у меня есть файл users_roles.yml , который я хотел бы заполнить, просматривая все приборы в role.yml и назначая их определенному пользователю. Я делаю это с помощью блока ниже:

users_roles.yml

<% Role.all.each do |role| %>
<%= 'super_test_user' + role.name %>:
  user_id: <%= ActiveRecord::FixtureSet.identify(:super_test_user) %>
  role_id: <%= ActiveRecord::FixtureSet.identify(role.name.to_sym) %>
<% end %>

Моя проблема в том, что когда я запускаю RAILS_ENV=test rake db:fixtures:load, Rails достигает * 1015Сначала файл * users_roles.yml , поэтому в объекте Role нет ничего, что могло бы пройти через него. У меня есть сотни ролей, поэтому я хочу по возможности избегать этого вручную.

Есть ли способ заставить Rails загружать role.yml светильники до * 1022? * user_roles.yml файл, когда я звоню RAILS_ENV=test rake db:fixtures:load? Я попробовал ответ на Загрузка устройств Rails в определенном порядке при тестировании , но, к сожалению, не могу заставить это работать. Я изменил этот ответ следующим образом в моем test_helper.rb файле:

test_helper.rb

class ActiveRecord::FixtureSet
  class << self
    alias :orig_create_fixtures :create_fixtures
  end

  def self.create_fixtures f_dir, fs_names, *args
    Role.delete_all
    User.delete_all

    reset_cache

    fs_names = %w(role user) & fs_names | fs_names

    orig_create_fixtures f_dir, fs_names, *args
  end
end

Я сделалчто-то не так в вышесказанном? Или есть другой способ, которым я мог бы добиться этого?

РЕДАКТИРОВАТЬ: я должен также добавить причину, по которой я загружаю приборы таким образом, потому что это приложение Rails (давайте назовем его 'A') вызывается из другогоПриложение Rails (B). Таким образом, тестовые приборы в «A» должны быть загружены в тестовую базу данных, прежде чем приложение «B» вызовет их в тестовой среде.

1 Ответ

0 голосов
/ 03 октября 2019

ОК - так что я нашел решение, которое немного хакерское, но оно работает. Я опубликую здесь на случай, если кто-то столкнется с той же проблемой:

  1. Выполнить rake db:test:prepare
  2. Выполнить RAILS_ENV=test rake db:fixtures:load FIXTURES=roles
  3. Теперь выполнить RAILS_ENV=test rake db:fixtures:load

Это гарантирует, что все роли были предварительно загружены в правильную таблицу БД, и на них можно ссылаться из объекта Role в файле фикстуры объединяемой таблицы.

Я бы предпочелчтобы автоматизировать это в файле test_helper.rb . Есть идеи, как мне это сделать?

...