【问题标题】:ActiveRecord autogenerating Schema.rb file with force::cascade that deletes my recordsActiveRecord 使用 force::cascade 自动生成 Schema.rb 文件,删除我的记录
【发布时间】:2019-10-28 21:03:59
【问题描述】:

我正在使用 ActiveRecord 创建一个 Sinatra 应用程序来保存数据。当我运行 rake db:migrate 时,它​​会自动生成一个 schema.rb 文件,其中包含带有 force::cascade 的表名。这不会让我保存/保留我的数据。如果我删除此文件,我可以保存/保留数据。但是,每次迁移都会生成此架构文件。我不知道如何阻止这种情况发生。

class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t| 
      t.string :name 
      t.string :email 
      t.string :password_digest 
  end
end 
end
require "./config/environment"
require "./app/models/user"
class UserC < Sinatra::Base

  configure do
    set :views, "app/views"
    enable :sessions
    set :session_secret, "password_security"
  end

end

require "bundler" 
Bundler.require

ActiveRecord::Base.establish_connection(
  :adapter => "sqlite3",
  :database => "development.sqlite"
)

require_all 'app'
require_all 'db'
require_relative './config/environment'

use Rack::MethodOverride
#use Rack::Session::Cookie
run UserController
#gemfile # frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
gem 'activerecord', :require => 'active_record'

gem 'pry'
gem 'pry-nav'
gem 'bcrypt'
gem 'rake'
gem 'require_all'
gem 'rack_session_access'
gem 'shotgun'
gem 'sinatra'
gem 'sinatra-activerecord', :require => 'sinatra/activerecord'
gem 'sqlite3'
gem 'thin'
gem 'tux' 

【问题讨论】:

  • "这不会让我保存/保留我的数据" 你是怎么得出这个结论的? schema.rb 只是数据库模式在创建或上次迁移时的表示,它是通过从数据库中读取模式生成的。此文件的存在不会影响您写入数据库的能力。如果您收到特定错误,请发布该错误以及重现该错误的确切步骤。
  • Binding.pry。它创建记录(即 User.all.count == 1)。然后在重定向时删除记录(即强制::删除 repl 和 User.all.count ==0)。
  • 太棒了。如果我删除此文件,它会保存/保留记录。当我运行迁移时,我会取回文件并在 repl (pry) 中强制::Cascade,并在重定向时删除记录。
  • 您在 cmets 中所说的一切都没有多大意义。 schema.rb 的存在不会导致记录不持久。此外,这些不是重现的步骤。如果您有特定错误或意外结果,那么您必须在问题中发布确切步骤以重现它。您的示例中甚至没有任何 User.createUser.new.save 代码!
  • 我已经要求您两次在您的问题中放置重现此错误所需的确切步骤和确切代码。您留下的 cmets 没有帮助。此外,您坚持认为问题在于 schema.rb 的存在,我告诉您这不是问题。这不是 schema.rb 如何工作或它存在的原因。我已投票决定将此问题作为离题结束,因为它不包含重现该问题所需的代码。请阅读:stackoverflow.com/help/minimal-reproducible-example

标签: ruby activerecord sinatra sinatra-activerecord


【解决方案1】:

我将此留给未来在构建自定义 Sinatra ActiveRecord 应用程序时遇到令人困惑的错误的用户。

吸取的教训是准确了解所有宝石在做什么。在我的问题中,错误来自环境文件。添加了 require_all "db" 是因为我假设 require_all 让我的应用程序可以访问指定的文件。 require_all 将运行该文件。需要注意的是,这个环境文件会针对对 db 的每个请求运行。因此,包含 create_table 文件的 db 文件夹针对每个获取请求运行。删除 require_all 'db' 后,我的应用程序开始完美运行。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 2019-03-05
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多