ActiveRelation Query пуст в Rails System Test, но работает интерактивно - PullRequest
0 голосов
/ 06 мая 2019

Работает в интерактивном сеансе, но не проходит в тесте Rails System:

При использовании byebug неожиданно возвращается пустой в представлении шоу

@item.children.where(done: false)

Если я пропущу ActiveRelation, вот так, я правильно вижу объект

@item.children

#<ActiveRecord::Associations::CollectionProxy [#<Item id: 980190964, title: "my item", done: false

Эта неожиданно возвращает 1 запись

@item.children.where.not(done:false)

Настройка (работает хорошо)

  setup do
    @user = users(:one)
    visit login_url
    fill_in "Email", with: @user.email
    fill_in "Password", with: 'secret'
    click_on "Login"    
  end

Тест (работает хорошо, но элемент не будет отображаться!)

  test "create one entry" do
    visit item_url(@user.top_item)
    fill_in('item[title]', with: 'my item')
    find_field('item[title]').native.send_key(:enter)    
    visit current_path
    assert_selector "h5", text: "parentObject", match: :one
  end

Часть шоу-акции:

@children = @item.children
@newItem = current_user.items.new

Часть представления шоу:

<% @children.where(done: false).each do |item| %>

Даже атрибут @children пуст. Перезагрузка не имеет никакого значения.

1 Ответ

1 голос
/ 07 мая 2019

Сработало, когда я установил для параметра ниже значение false.Я посмотрел на схему непосредственно в sqlite3, и для поля «done» по умолчанию установлено значение «false», а не «0».Но почему тогда так гладко в разработке, а не тестировать?Возможно, некоторые конфликты с файлами yaml все еще используют «false».Поэтому некоторое время я буду придерживаться устаревшей настройки, пока полностью не пойму последствия и смогу выполнить надлежащую миграцию позже.

Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = false

Причина, по которой я пытаюсь выполнить истину:

ПРЕДУПРЕЖДЕНИЕ УСТАРЕВАНИЯ: Оставление ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer равным false устарело.Базы данных SQLite использовали 't' и 'f' для сериализации логических значений и должны иметь старые данные, преобразованные в 1 и 0 (его собственная логическая сериализация), перед установкой этого флага в значение true.Преобразование можно выполнить, настроив задачу rake, которая запускается

ExampleModel.where("boolean_column = 't'").update_all(boolean_column: 1)
ExampleModel.where("boolean_column = 'f'").update_all(boolean_column: 0)

для всех моделей и всех логических столбцов, после чего для флага необходимо установить значение true, добавив следующее в файл application.rb:

Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...