升级到 rails 4.2.1 会导致 validate_uniqueness_of 规范失败

Upgrading to rails 4.2.1 causes validate_uniqueness_of specs to fail

我有一个目前 运行 在 rails 4.1.4 上的应用程序,我正在尝试将其升级到 4.2.1

当涉及到 validates_uniqueness_of 声明时,我 运行 遇到了某些模型规格的问题

我的模特:

class PromoCode < ActiveRecord::Base
  validates_presence_of :expiration_date, :code, :discount
  validates_uniqueness_of :code
end

class Coupon < ActiveRecord::Base
  validates :code, presence: true, uniqueness: true
end

我的规格:

RSpec.describe PromoCode, type: :model do
  it { is_expected.to validate_presence_of(:expiration_date) }
  it { is_expected.to validate_presence_of(:code) }
  it { is_expected.to validate_presence_of(:discount) }
  it { is_expected.to validate_uniqueness_of(:code) }
end

RSpec.describe Coupon, type: :model do
  it { is_expected.to validate_presence_of(:code) }
  it { is_expected.to validate_uniqueness_of(:code) }
end

存在性规范通过良好,但对于两个模型,唯一性规范均失败,并返回:

Failure/Error: it { is_expected.to validate_uniqueness_of(:code) }
  NoMethodError:
    undefined method `primary' for #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007f99176e0f20>

这是怎么回事?

这个

it { is_expected.to validate_uniqueness_of(:code) }

由 shoulda matchers gem 提供。看起来像一个错误。将 gem 更新到 2.80+ 稳定版应该可以解决这个问题。这里有一些细节

https://github.com/thoughtbot/shoulda-matchers/issues/639