我想以类似于生成器的方式调用另一个迁移.基本上,如果您有一个创建表,那么在将来的某个时间点,您将不再使用该表,并且您希望迁移进行调用,up并且down与原始创建迁移的迁移完全相反.如果有可能那么我会创建一个类似的生成器
rails g reverse_migration CreateModel
Run Code Online (Sandbox Code Playgroud)
然后结果是这样的
class ReverseCreateModel < ActiveRecord::Migration
def up
#call to create model down
end
def down
#call to create model up
end
end
Run Code Online (Sandbox Code Playgroud)
我不想要任何解决方法,而是明确地重复代码并保持干净迁移和角色的能力.
任何帮助将不胜感激!
Rails 3.2
MySQL gem
Run Code Online (Sandbox Code Playgroud)
我在迁移中有以下内容:
t.decimal :pre_tax_total, default: nil, scale: 2
t.decimal :post_tax_total, default: nil, scale: 2
Run Code Online (Sandbox Code Playgroud)
根据我读到的内容,scale:2将产生一个带有2个尾随数字的小数.
当我运行迁移,并查看表结构时,我看到以下内容:
pre_tax_total decimal(10,0)
post_tax_total decimal(10,0)
Run Code Online (Sandbox Code Playgroud)
这意味着MySQL服务器会截断这些值.将这些列创建为十进制(10,2)的ActiveRecord语法是什么?
我正在开发一个 Rails 引擎(插件)。到目前为止我有
MyJobspec/models/my_job_spec.rbrails 模板会自动创建一个spec/dummy应用程序,因此我执行以下操作来运行我的测试
# Create the development and test DBs
rake db:create
# Copy migrations over to my dummy app
cd spec/dummy
rake my_app:install:migrations
cd ../..
# Run specs
rspec spec/models/my_job_spec.rb
Run Code Online (Sandbox Code Playgroud)
但是,当我运行规范时,出现错误:
> rspec spec/models/
/Users/jeeves/.rvm/gems/ruby-2.2.2@gb/gems/activerecord-5.1.0/lib/active_record/migration.rb:576:in `check_pending!': (ActiveRecord::PendingMigrationError)
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)
我认为这会自动发生,因为rails_helper.rb我肯定有以下内容,这应该为我维护我的测试模式
ActiveRecord::Migration.maintain_test_schema!
Run Code Online (Sandbox Code Playgroud)
它与插件或引擎的工作方式不同吗?
编辑:我尝试了运行bin/rails db:migrate RAILS_ENV=test, insidespec/dummy/然后重新运行的建议rspec spec/。仍然没有运气。
rspec ruby-on-rails rails-models rails-migrations rails-engines
我使用以下命令创建了一个模型:
rails g model UserCertification user:references certification:references certification_no:string
Run Code Online (Sandbox Code Playgroud)
这是参考我的设计用户模型user:references。
在 db:migrate 我收到以下错误: 引起:
ActiveRecord::MismatchedForeignKey:
user_id表user_certifications上的列id与users类型为 的列不匹配bigint(20)。要解决此问题,请将user_id列的类型更改user_certifications为 :bigint。(例如t.bigint :user_id)。原消息:Mysql2::Error:无法添加外键约束
这是我的迁移
class CreateUserCertifications < ActiveRecord::Migration[6.0]
def change
create_table :user_certifications do |t|
t.references :user, null: false, foreign_key: true
t.references :certification, null: false, foreign_key: true
t.string :certification_no
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud)
我试图将类型设置为整数 t.references :user, null: false, foreign_key: true,type: :integer
我还删除了模型并重新编辑并检查了以前的参考资料,但没有成功。也许有人有想法?
我的应用程序 rails 应用程序在生产中将 postgres 语句超时设置为 5 秒。这个超时对我们很有效,帮助我们捕捉生产中的错误,终止错误的查询等。但是,当我们部署更改时,我们有时希望运行需要超过 5 秒的数据迁移,并且经常遇到残酷的PG::QueryCanceled: ERROR: canceling statement due to statement timeout. 因此,我们正在寻找一种方法,将迁移的语句超时时间增加到约 10 分钟。做这个的最好方式是什么?
以下是我们所经历的选项以及我们对其中任何一个都不满意的原因。
1) 在您认为可能有问题的每个单独迁移中增加语句超时。-> 通常,开发人员会忘记或无法估计这需要多长时间。如果他们搞砸了,我们最终会出现部署失败、挑选等问题。
2)使用Task.enhance for db:migrate(或其他方法)增加每个任务前的语句超时时间。-> 使用增加语句超时很容易,ActiveRecord::Base.connection.execute 'SET statement_timeout = 600000'但这仅适用于现有连接。事实证明,当您运行时rake db:migrate,ActiveRecord实际上会打开一个新的数据库连接,该连接将恢复为现有的默认值。
3) Monkey 修补了实际的迁移方法,以在创建连接后设置语句超时。-> 请参阅下面的代码,它并不漂亮,并且使用 ActiveRecord 内部函数可能会产生我们不知道的后果。
# See here for overriding static methods:
# /sf/ask/638996081/
# We need to override this method because immediately before this the database connection gets reset
# Override when we are running normally
# …Run Code Online (Sandbox Code Playgroud) 为什么我不能这样做:
class CreateModels < ActiveRecord::Migration
def self.up
create_table :fruit do |t|
t.array :apples
end
end
end
Run Code Online (Sandbox Code Playgroud)
是否有其他方法可以使数组("apples")成为Fruit类实例的属性?
我有一堆迁移,但由于一些奇怪的原因,rails突然忘记它已经运行了大部分.现在,当我尝试运行时rake db:migrate,rails将尝试运行所有迁移.
如何设置当前的"版本号"或其中的任何名称,以便rails知道"哦,我已经运行了前5次迁移,我应该从第6次迁移开始"
我有一个Rails 2项目,通过连接表有很多关系.让我们把表A,B,和ABJ,其中ABJ具有性能a_id和b_id(连同不相干到这-问题id和{created,updated}_at).
不幸的是,这种关系从一开始就被错误地创建,应该只是一个多(A has_many B's,B belongs_to A).所以我创建了一个向上迁移,将B直接重新关联到A. 基本上,1)add_column a_id到B,2)为每个ABJ,把abj.a.id放到abj.b.a_id,3)drop_table:abj.这很好用.
我还在向下迁移中创建了"逆"操作,如果我需要为每个B创建(1)create_table abj,2),则创建一个新的abj,使得abj.a_id = b.a_id和abj.b_id = b .id,3)从B)中删除_column a_id.这也很好.
随着"重新关联"这种关系与一个多的关系,期望不再使用的连接资源ABJ将消失,即删除模型,控制器,测试等.问题是,如果我这样做需要返回,运行向下迁移将无法工作,因为在步骤2(对于每个B,创建一个新的abj),class ABJ < ActiveRecord::Base自从我删除模型后就不再有了.
那么,为了操纵数据库中的数据,有没有办法在迁移中制作"临时"模型?或者您是否只是要求运行迁移的人在运行之前确定该模型是否存在?因为如果在步骤2中向下迁移失败,则步骤1已经创建了abj表,然后您必须手动删除它或在迁移中注释掉第1步代码,然后再次运行它(然后取消注释它) ).
想知道是否有任何好的解决方案.
我正在将Rails 1.2.3应用更新到3.2.1.
我试图找出如何更新迁移结构以与最新版本的Rails兼容,这样理想情况下,您可以rake db:migrate在设置应用程序时运行.目前,我通过执行rake db:migrate:up VERSION=[version_number]我需要运行的任何迁移来解决这个问题.如果我只是运行rake db:migrate,它会尝试从一开始就重新运行所有迁移并停止(因为那些迁移已经在我拥有的db转储中运行).
应用程序中的迁移看起来像这样001_add_some_model.rb,002_add_some_other_model.rb而不是20120209182512_add_some_model.rb.
有人对这个有经验么?我怎样才能解决这个问题?
我正在尝试创建一个 Collaboration在我的Rails 4项目中表,但我遇到了一个问题.我希望它属于单个用户,合作者.
我运行以下命令来生成模型和迁移,我也在下面复制了它.
rails generate model Collaboration project:references collaborator:references accepted:boolean
Run Code Online (Sandbox Code Playgroud)
移民:
class CreateCollaborations < ActiveRecord::Migration
def change
create_table :collaborations do |t|
t.references :project, index: true, foreign_key: true
t.references :collaborator, index: true, foreign_key: true
t.boolean :accepted
t.timestamps null: false
end
end
end
Run Code Online (Sandbox Code Playgroud)
模型:
class Collaboration < ActiveRecord::Base
belongs_to :project
belongs_to :collaborator, class_name: 'User'
end
Run Code Online (Sandbox Code Playgroud)
我更新了Collaboration模型,, class_name: 'User'如上所示.同样,我更新了现有Strategy模型以包含ahas_many :collaborations
class Project < ActiveRecord::Base
has_many :collaborations
end
Run Code Online (Sandbox Code Playgroud)
当我运行时rake db:migrate,我收到以下错误报告.
rake aborted!
StandardError: An error …Run Code Online (Sandbox Code Playgroud) ruby ruby-on-rails associations rails-migrations rails-activerecord
rails-migrations ×10
ruby-on-rails ×10
activerecord ×2
ruby ×2
arrays ×1
associations ×1
model ×1
postgresql ×1
rails-models ×1
rake ×1
rspec ×1