12

我有 3 个模型,用户、游戏和播放器。用户和游戏之间基本上是多对多的关系,玩家作为连接表,除了玩家有其他信息,所以它有自己的模型。

玩家需要一个独特的游戏 id 和用户 id 组合,所以我试着在玩家中说:

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...

知道出了什么问题吗?

4

4 回答 4

9

虽然这是一个已知问题,但有一种解决方法。

如果您首先创建一条记录,然后测试唯一性验证,它将起作用。

所以,而不是简单地写

it { should validate_uniqueness_of(:user_id) }

你可以写

it do
  FactoryGirl.create(:player)
  should validate_uniqueness_of(:user_id)
end

并且唯一性验证规范将起作用。

参考:http ://rubydoc.info/github/thoughtbot/should-matchers/master/frames

于 2013-12-26T21:57:19.957 回答
9

这是一个已知问题。如果作用域字段依赖于模型并且也设置为 ,则会出现此错误:null => false

另外,请查看rails Column cannot be null:

于 2013-04-28T21:55:04.300 回答
1

您可以在此处阅读官方源代码警告中提到的问题和解决方案

一种解决方案是:

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
于 2015-01-07T19:16:22.623 回答
1

对于今天遇到此问题的人来说,这是一个更新的解决方案。

添加一个主题,以便测试有一个带有值的记录。

另外,请注意较新的 RSpec 语法。

    subject { create(:player) }

    it { is_expected.to validate_uniqueness_of(:user_id).scoped_to(:game_id)}

查看github 上的文件以获取更多信息

于 2018-05-16T16:26:14.607 回答