通常,在保存之前,我们可以使用self.class.exists?(api_key: api_key)检查表中的任何其他行是否有值:

def set_api_key
  self.api_key ||= loop do
    api_key = SecureRandom.hex(24)
    break api_key unless self.class.exists?(api_key: api_key)
  end
end

但在本例中,api_key实际上是名为config的jsonb列上的值:
class User < ApplicationRecord
  before_validation :set_api_key, on: [:create]
  validates :api_key, presence: true, uniqueness: true

  store_accessor :config, :status, :plan, :api_key

  def set_api_key
    self.api_key ||= loop do
      api_key = SecureRandom.hex(24)
      break api_key unless self.class.exists?(api_key: api_key)
    end
  end
end

假设:status:plan:api_key都是名为config的JSONB列的顶级属性。
结果是:ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column users.api_key does not exist
有没有一种轻巧的方法可以用类似的方式实现这一点self.class.exists?(key: value)工作是否可以使用低成本的SQL查询?

最佳答案

json(b)中有一些特殊的运算符(Postgres Docs
->>将以字符串的形式访问jsonb元素,即config->>api_key而不是config.api_key
你应该能够做到这一点self.class.exists?('config->>api_key = ?', api_key)

关于ruby-on-rails - 是否在没有self.class.exists的情况下确保Rails ActiveRecord中JSONB中嵌套值的唯一性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58312059/

10-16 19:29