【问题标题】:activerecord default id column issueactiverecord 默认 id 列问题
【发布时间】:2021-06-24 09:33:23
【问题描述】:

我想在实体中使用默认的活动记录 ID 列。由于某种原因,ROR 引擎正在发送该列的字符串值。知道为什么会这样吗?预计插入新数据时会忽略id。

型号:

class SampleModel < ApplicationRecord
end

这是 ApplicationRecord 的样子:

class ApplicationRecord < ActiveRecord::Base
  include Helpers::Model

  self.abstract_class = true

  class IdType < ActiveRecord::Type::Value
    def cast(value)
      value.class == BSON::ObjectId ? value.to_s : value
    end

    def serialize(value)
      value.to_s if value
    end
  end

  attribute :id, IdType.new
  attribute :account_id, IdType.new
  attribute :affiliated_account_id, IdType.new
  attribute :content_order_id, IdType.new
  attribute :project_id, IdType.new

  class << self
    def group_by_id
      all.group_by(&:id).transform_values(&:first)
    end
  end
end

下面是 ApplicationRecord 中包含的辅助模块:

  module Helpers
    module Model
      extend ActiveSupport::Concern
      W_AUTO_ATTRIBUTES = %w[id _id _type type created_at updated_at deleted_at version_1_id]
    end
  end

Mongoid::Document.send(:include, Wordapp::Helpers::Model)
Mongoid::Document.send(:include, Mongoid::Attributes::Dynamic)

迁移如下所示:

class CreateSampleModels < ActiveRecord::Migration[5.2]
  def change
    create_table :sample_models do |t|
      t.string :title, null: false
      t.string :description, null: false

      t.timestamps
    end
  end
end

数据库架构:

CREATE TABLE public.sample_models
(
    id bigint NOT NULL DEFAULT nextval('sample_models_id_seq'::regclass),
    title character varying COLLATE pg_catalog."default" NOT NULL,
    description character varying COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT sample_models_pkey PRIMARY KEY (id)
)

创建时出错:

SampleModel.create(title: 'sample', description: 'sample')


PG::InvalidTextRepresentation - ERROR:  invalid input syntax for type bigint: "60d33fc29dc7938a6a355d63"

SampleModel Create (0.8ms)  INSERT INTO "sample_models" ("id", "title", "description", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["id", "60d33fc29dc7938a6a355d63"], ["title", "test"], ["description", "test"], ["created_at", "2021-06-23 14:05:54.192075"], ["updated_at", "2021-06-23 14:05:54.192075"]]

请参阅下面的 Gemfile。提供 gemfile 是因为某些 gem 可能会造成问题:

source 'https://rubygems.org'

gem 'rails', '5.2.3'
# gem 'attr_reader :attr_namesack-timeout'
gem 'rack-cors', require: 'rack/cors'

#i18n
gem 'i18n-tasks', '~> 0.9.20'
gem 'rails-i18n', '5.0.0'
gem 'i18n-js', '~> 3.0.0.rc11'
gem 'twitter_cldr', '4.4.2', require: true

# Monitoring
gem 'rollbar', '~> 2.13.2'

gem 'yomu', '~> 0.1.5'

# DB
gem 'pg'
gem 'pg_search'
gem 'ransack', '~> 2.1.1'
gem 'mongoid', '6.2.0'
gem 'paranoia', '2.4.1'
gem 'mongoid_paranoia', github: 'simi/mongoid_paranoia', branch: 'b00af0eae33cc12443ec83f2d43d6da430353006'
gem 'has_scope', '~> 0.5.1'
gem 'simple_enum', '~> 2.1.1', require: 'simple_enum/mongoid'
gem 'redis-rails'

# Auth
gem 'doorkeeper', '~> 4.0'
gem 'devise', '~> 4.4.0'
gem 'cancancan', '~> 1.10'
gem 'omniauth-facebook', '~> 5.0.0'
gem 'omniauth-google-oauth2', '~> 0.5.3'

# Backend
gem 'jbuilder', '~> 2.0'
gem 'kaminari', '~> 1.1.1'
gem 'kaminari-mongoid', '~> 1.0.1'
gem 'money-rails', '~> 1.9.0'
gem 'email_validator', '~> 1.4.0'
gem 'apipie-rails', '0.5.4'
gem 'reverse_markdown', '1.0.3'
gem 'valvat', github: 'yolk/valvat', tag: 'v0.7.4'
gem 'stripe', '4.21.3'

# HTTP client utils
gem 'faraday', '~> 0.12'
gem 'typhoeus', '~> 0.7.1'

# IDN punnycode to unicode conversion
# depricated. use Addressable::IDNA.to_unicode() instead
# gem 'simpleidn', '~> 0.0.7'

# Cron Manager
gem 'clockwork', '1.2.0'
gem 'daemons'

# File uploading
gem 'carrierwave-mongoid' , '~> 0.10.0', require: 'carrierwave/mongoid'

# AWS
gem 'carrierwave-aws', '~> 1.0.2'
gem 'aws-sdk', '~> 2.5.6'

# Sidekiq
gem 'sidekiq', '~> 4.0.1'
gem 'sidekiq-delay', '~> 1.0.5'
gem 'sidekiq-status', '~> 1.0.1'
gem 'sinatra', '~> 2.0.0.beta2', require: nil
# gem 'devise-async', '~> 0.10.2'

# File import/export utilites
gem 'pandoc-ruby', '~> 0.7.5', require: 'pandoc-ruby'
gem 'wicked_pdf', '~> 1.1.0'
gem 'wkhtmltopdf-binary'

# Copyscape
gem 'copyscape', github: 'zeitnot/copyscape-rb'

# Frontend
gem 'maruku', '~> 0.7.2'
gem 'haml', '5.0.4'
gem 'haml-rails', '~> 1.0'
gem 'bootstrap-sass', '~> 3.1.1.1'
#gem 'font-awesome-sass', '~> 4.5.0'
gem 'font-awesome-rails', '~> 4.7.0'
gem 'sass-rails', '>= 5.0.1'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2.1'
gem 'jquery-rails', '~> 4.2.1'
gem 'bower-rails', '~> 0.10.0'
gem 'angular-rails-templates', '~> 1.0.2'

# Image util
gem 'fastimage', '~> 1.8.1'

gem 'faker', '~> 1.4.3', require: false, group: [:staging,:development, :test, :beta]

gem 'mandrill-api'

# for table prints (alpay added)
gem 'table_print'
gem 'hirb'
gem 'awesome_print'

# Servers
gem 'rack', '2.0.1'
gem 'puma', '3.12.1'

gem 'rubyzip', '1.2.1', require: false

# Google API
gem 'googleauth', '~> 0.6.2'
gem 'google-cloud-translate'
gem 'google-adwords-api', '~> 1.3.1'
# gem 'google-ads-googleads'
gem 'google-api-client', '~> 0.8'
gem 'google_drive'
gem 'hotwater', require: false

group :production, :staging, :beta do
  gem 'asset_sync', '~> 1.0.0'
end

group :development do
  gem 'annotate'
  #gem 'guard-bundler', '~> 2.1.0'
  gem 'guard-rake', '~> 1.0.0'
  gem 'guard-rspec', '~> 4.6.4'
#  gem 'guard-brakeman', '~> 0.8.1'
  gem 'guard-pow', '~> 2.0.0'
  gem 'guard-rubocop', '~> 1.0.2'
  gem 'guard-teaspoon', '~> 0.8.0'

  gem 'better_errors', branch: 'master', github: 'charliesome/better_errors'
  gem 'rubocop', '~> 0.26.1', require: true
  gem 'brakeman', '~> 4.1.1', require: false
  gem 'spring'
  gem 'spring-commands-rspec'
  gem 'binding_of_caller', '0.8.0'

  gem 'capistrano', '~> 3.7.0',           require: false
  gem 'capistrano-rails', '~> 1.1.2',     require: false
  gem 'capistrano-rvm', '~> 0.1.1',       require: false
  gem 'capistrano-bundler', '~> 1.1.3',   require: false
  gem 'capistrano-sidekiq', '~> 0.5.4',   require: false
  gem 'capistrano-maintenance', '~> 1.0', require: false
  gem 'capistrano3-puma', '3.1.1',        require: false

  gem 'yard',           require: false
  gem 'redcarpet',      require: false
  gem 'github-markup',  require: false

  gem 'bullet', '~> 5.7.2'
end

group :development, :test do
  gem 'pry-rails', '~> 0.3.2'
  gem 'factory_girl_rails', '~> 4.7.0'
  gem 'teaspoon-mocha', '~> 2.3.3'
  gem 'colorize'
  gem 'selenium-webdriver'
  gem 'benchmark-ips'
end

group :test do
  gem 'database_cleaner'
  gem 'rspec-rails', '~> 3.8'
  gem 'rails-controller-testing'
  gem 'mongoid-rspec', github: 'zeitnot/mongoid-rspec'
  gem 'rainbow', '2.2.2' # TODO: This is here owing the codeship's failing tests.
  gem 'shoulda-matchers', '~> 2.6.1'
  gem 'json_spec', '~> 1.1.4'
  gem 'api_matchers', '~> 0.6.2'
  gem 'airborne', '~> 0.2.13'
  gem 'simplecov', '~> 0.15.0', require: false
  gem 'simplecov-console', '~> 0.4', require: false
  gem 'email_spec', '~> 1.6.0'
  gem 'rspec-sidekiq', '~> 1.0.0'
  gem 'rspec-collection_matchers', '~> 1.1.2'
  gem 'capybara', '~> 2.15.1'
  gem 'poltergeist', '~> 1.16.0'
  gem 'webmock', '~> 3.4.2'
  gem 'vcr', '5.0.0'
end

【问题讨论】:

  • 您可以运行rails db 连接到postgres 控制台,然后运行SELECT nextval('sample_models_id_seq'::regclass);吗?
  • @max 当我运行它时 - 返回值是正确的整数。 1、2、3...
  • 好像是项目某处的全局配置,就是不知道在哪里配置。
  • 好的,这告诉我们架构不是罪魁祸首。 ApplicationRecord 有什么可以解释的吗?你有任何可能在它背后的宝石吗?它看起来有点像 UUID。
  • Rails 本身 AFAIK 中没有配置可以更改所有主键的类型,这看起来像是在让模型生成默认值而不是让数据库生成的 UUIDS 的“错误方式”它。我怀疑有些宝石正在做猴子补丁,但我想不出来。

标签: ruby-on-rails activerecord ruby-on-rails-5


【解决方案1】:

你有宝石pg(用于 postgres)和其他一些用于 Mongoid 的宝石

您的 ApplicationRecord 是否包括

include Mongoid::Document
include Mongoid::Ids

因为在我看来 ActiveRecord 使用 postgres 作为适配器,但生成的 id 来自 Mongoid::Document 或 Mongoid::Ids 包含的一些魔法

【讨论】:

  • 不知何故我没有注意到模型继承自 ApplicationRecord 而不是 ActiveRecord:Base。 ApplicationRecord 有一些 id 配置。我已经更新了问题。
  • 您正在将 mongodb 内容包含到使用 postgres 的模型中。您想在哪里保留该模型?您可以检查将事物存储在同一数据库中的另一个模型的继承类吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多