Я создаю приложение Rails, и я столкнулся с действительно странной ошибкой. Код [true false].sample
никогда не должен возвращать пустой. Однако иногда это происходит при запуске rake db:seed
..sample возвращает nil при посеве Rails app
В моем приложении у меня есть модель магазина, который имеет присутствие валидаций:
class Store < ActiveRecord::Base
validates_presence_of :accepts_credit, :parking
end
Я также запустить тест в RSpec, как это (что всегда проходит)
require 'rails_helper'
RSpec.describe Store, type: :model do
it { should validate_presence_of :accepts_credit }
it { should validate_presence_of :parking }
end
Теперь в моих семян файл у меня есть
Store.create(
...
accepts_credit: [false, true].sample(1),
parking: %w[lots some none].sample(1),
...
)
Запуск в терминале с rake db:reset --trace
, я получаю сообщение об ошибке что магазин не был создан. Я проверил это, выполнив Store.create!
вместо Store.create
, что заставляет терминал отображать ошибки. Validation failed: Accepts credit can't be blank
.
Теперь я относительно новичок в Rails, но я не понимаю, почему метод образца .sample
может вернуть пустой. Согласно документам: http://ruby-doc.org/core-2.2.0/Array.html#method-i-sample, образец всегда возвращает элемент из массива.
Редактировать
Я использовал .sample
в замене из .sample(1)
, а также.
Что мне не хватает? Есть .blank
делать то, что я думаю?
Хорошо, это имеет смысл и была моей первой интуицией, но соглашатели должны сказать, что вы не должны использовать включение в буле. Вот ссылка на документы: https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb. – user3162553
На второй мысли, я думаю, это отвечает на вопрос. Вы не должны проверять наличие булевых элементов, потому что AR будет их выводить. Ваш ответ возникает, когда вы понимаете, что делает AR. Благодаря! – user3162553
AR будет отображать значения после того, как записи были извлечены из БД, поэтому 'Store.last.accepts_credit?' Будет работать как ожидалось, независимо от проверки включения. Тем не менее, может быть важно убедиться, что у вас нет значений NULL в логических полях, потому что такие запросы, как 'Store.where (accepts_credit: false)', не возвращают такие записи. 'FALSE'! =' NULL' в БД. – Ben