Какой предпочтительный способ создания доменных таблиц (справочных таблиц) в рельсах? - PullRequest
3 голосов
/ 11 декабря 2011

Я читаю Книгу рельсов предприятия Дана Чака - Великая книга. В книге он обсуждает таблицы доменов или справочные таблицы и предлагает создать эти таблицы, добавив операторы вставки в определение схемы - поскольку таблицы вряд ли изменятся. Книга была написана до появления файла seed.rb, поэтому мой вопрос (ы) следующий:

  1. Учитывая наличие файла seed, предпочтительнее / лучше использовать файл seed для создания таблиц доменов или все же предпочтительнее использовать операторы вставки для определения схемы.

  2. Если операторы вставки по-прежнему предпочтительнее, нужно ли просто вводить операторы вставки и затем запускать db: rake migrate.

Ответы [ 2 ]

1 голос
/ 02 мая 2012

У меня был тот же вопрос, и я нашел эту страницу, пытаясь выяснить, как другие решили ее.

Я не думаю, что это лучшее решение, но я закончил тем, что поместил данные домена в модель, используя find_or_create_by ..., потому что я не мог понять, как заполнить начальные данные до того, как модель установится во время тестов .

0 голосов
/ 17 января 2014

Помещение данных домена в модель с использованием find_or_create_by вызвало у меня некоторые проблемы во время тестов. Я полагаю, что проблема заключается в том, что данные были вставлены, а константа определена во время транзакции БД теста. После тестового примера транзакция db откатывается, оставляя все еще инстанцированную константу, указывающую на запись, которая больше не существует.

Итак, я поместил данные домена в seeds.rb. Чтобы предотвратить проблему, отмеченную в Docunext, для модели, созданной до того, как данные занесены в базу данных, я использую необработанный SQL для вставок, например:

   # in db/seeds.rb
   ActiveRecord::Base.connection.execute "INSERT INTO invoice_statuses(name) values ('Approved'), ('Sent'), ('Paid');"

И я сконфигурировал гем database_cleaner, чтобы пропустить все таблицы доменов при очистке базы данных между тестами:

    # in spec/support/database_cleaner.rb
    RSpec.configure do |config|

      domain_data = %w[aql_results invoice_statuses service_results remark_types]

      config.before(:suite) do
        DatabaseCleaner.strategy = :deletion, { except: domain_data }
        DatabaseCleaner.clean
      end

      config.before(:each) do
        DatabaseCleaner.strategy = :transaction
      end

      config.before(:each, :js => true) do
        DatabaseCleaner.strategy = :deletion, { except: domain_data }
      end

      config.before(:each) do
        DatabaseCleaner.start
      end

      config.after(:each) do
        DatabaseCleaner.clean
      end

    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...