Ответ 1
Это известная проблема. Он дает эту ошибку, если область области действия зависит от модели, а также устанавливается на :null => false
.
Кроме того, посмотрите rails Колонка не может быть нулевой:
У меня есть 3 модели, пользователь, игра и плеер. В основном существует много разных отношений между пользователями и играми, а игроки - как таблица соединений, за исключением того, что у игроков есть другая информация, поэтому у нее есть своя модель.
Игроку нужна уникальная комбинация идентификатора игры и идентификатора пользователя, поэтому я попытался сказать в проигрывателе:
validates_uniqueness_of :user_id, :scope => :game_id
а затем в моей спецификации, я сказал (используя помощники по назначению):
it { should validate_uniqueness_of(:user_id).scoped_to(:game_id)}
вот те отношения, которые определяет игрок:
belongs_to :game, :inverse_of => :players
belongs_to :user, :inverse_of => :players
но я получаю ошибку ActiveRecord:: statementinvalid для этой спецификации
ActiveRecord::StatementInvalid: Mysql2::Error: Column 'game_id' cannot be null: INSERT INTO `players` ETC...
Любая идея, что пойдет не так?
Это известная проблема. Он дает эту ошибку, если область области действия зависит от модели, а также устанавливается на :null => false
.
Кроме того, посмотрите rails Колонка не может быть нулевой:
Пока это известная проблема, есть способ обойти ее.
Если вы сначала создаете запись, а затем проверяете проверку уникальности, она будет работать.
Итак, вместо простого написания
it { should validate_uniqueness_of(:user_id) }
Вы можете написать
it do
FactoryGirl.create(:player)
should validate_uniqueness_of(:user_id)
end
И спецификация проверки уникальности будет работать.
Ссылка: http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/frames
Вы можете прочитать о проблеме и решениях, упомянутых в официальном исходном коде caveat здесь
Одно из решений:
describe Player do
describe "validations" do
it do
expect(Player.new(game_id: 1)).
to validate_uniqueness_of(:user_id).
scoped_to(:game_id)
end
end
end