Как приборы ActiveRecord динамически вставляются в глобальное пространство имен? - PullRequest
0 голосов
/ 08 мая 2018

Документация для приборов ActiveRecord гласит:

Помимо доступа к базе данных, к данным прибора также можно получить доступ с помощью специального динамического метода, который имеет то же имя, что и модель, и принимает имя прибора для создания экземпляра:

И приводит этот пример.

test "find" do
  assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
end

Как именно Ruby on Rails вставляет "web_sites" в пространство имен таким образом? Я читаю документацию и исходный код в lib / active_record / fixtures.rb и не могу понять.

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

Сейчас лучшее решение, которое у меня есть, это сделать что-то вроде этого:

result = ActiveRecord::FixtureSet.create_fixtures("test/largefixtures", "web_sites")
rails_site = result[0].all_loaded_fixtures["web_sites"]["rubyonrails"].find

Это кажется довольно хрупким, не говоря уже о том, что я не уверен, как сохранить результат create_fixtures в области видимости в других местах файла.

1 Ответ

0 голосов
/ 17 августа 2018

Как вы написали, ответ находится в fixtures.rb с методом def setup_fixture_accessors(fixture_set_names = nil).

Вы видите, что создан новый модуль. Приспособления для крепления добавляются с помощью define_method в модуле. Таким образом, accessor_name становится доступным и может вызываться внутри модуля.

Наконец, include methods включает все методы модуля methods, определенные выше. Эти методы доступа теперь доступны в пространстве имен, вызывая def fixtures(*fixture_set_names) (обычно ActiveSupport::TestCase)

...