首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >activerecord默认id列问题

activerecord默认id列问题
EN

Stack Overflow用户
提问于 2021-06-24 17:33:24
回答 1查看 58关注 0票数 1

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

型号:

代码语言:javascript
复制
class SampleModel < ApplicationRecord
end

这是ApplicationRecord的外观:

代码语言:javascript
复制
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中的helpers模块:

代码语言:javascript
复制
  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)

迁移如下所示:

代码语言:javascript
复制
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

数据库架构:

代码语言:javascript
复制
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)
)

创建时出错:

代码语言:javascript
复制
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造成了麻烦:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2021-06-25 05:15:58

您有gem、pg (用于postgres)和其他一些用于Mongoid的gem

您的ApplicationRecord是否包括

代码语言:javascript
复制
include Mongoid::Document
include Mongoid::Ids

因为在我看来,ActiveRecord使用postgres作为适配器,但是生成的it来自Mongoid::Document或Mongoid::Ids所包含的某种魔术

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68113183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档