标签: rails-migrations

Rails — 迁移表(包含数据)以使用 UUID 而不是 ID

我有一个Project模型,它有依赖项,并且数据库中已经有记录。

我想将Project.id(它的主键)更改为 UUID,而不仅仅是递增整数。

如何编写一个迁移来更改 id、更新现有记录以具有 UUID 以及更新其他表外键中的引用?

ruby-on-rails rails-migrations ruby-on-rails-5

5
推荐指数
1
解决办法
872
查看次数

如何指定所有表应包含某些字段?

我已经用很多表(大约40个)定义了我的数据库.我现在意识到我想在每个表中添加某些列.为了这个例子,让它成为 created_byupdated_by.

有没有办法在不进行40次迁移的情况下轻松完成这些操作并手动更新每个迁移?

我正在使用rails 2.3.8

ruby-on-rails rails-migrations

4
推荐指数
1
解决办法
947
查看次数

尝试在self.up中创建记录时,Rails迁移会出错

我有以下迁移:

def self.up
  add_column :project_statuses, :system_sequence, :integer, :default => 0, :null => false

  ProjectStatus.create :name => 'Declined', :sequence => 35, :system_sequence => 110

  ...
end
Run Code Online (Sandbox Code Playgroud)

但是,当我做了rake db:create,rake db:migrate我得到以下错误:

==  NewProjectStatuses: migrating =============================================
-- add_column(:project_statuses, :system_sequence, :integer, {:default=>0, :null=>false})
   -> 0.0029s
rake aborted!
An error has occurred, this and all later migrations canceled:

unknown attribute: system_sequence
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1753:in `block in assign_attributes'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1747:in `each'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1747:in `assign_attributes'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1567:in `initialize'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:508:in `new'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:508:in `create'
/[working dir]/db/migrate/20100816100139_new_project_statuses.rb:7:in `up'
Run Code Online (Sandbox Code Playgroud)

错误的行号指的是Project.create :name => …

ruby activerecord ruby-on-rails rails-migrations

4
推荐指数
1
解决办法
1737
查看次数

如果没有InnoDB,Rails 3无法在MySQL MyISAM模式下运行吗?

我有一个运行InnoDB的MySQL服务器禁用(出于性能原因),使用此设置我似乎无法使用Rails 3(使用mysql2适配器).

这是我的测试迁移:

class CreateTxts < ActiveRecord::Migration
  def change
    create_table(:txts, :options => 'ENGINE=MyISAM') do |t|
      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这是错误:

>rake db:migrate
rake aborted!
Mysql2::Error: Unknown storage engine 'InnoDB': CREATE TABLE `schema_migrations`
(`version` varchar(255) NOT NULL) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)

尝试了这里描述的解决方法,但它似乎也没有工作(我确实修改了MysqlAdapter到Mysql2Adapter以匹配我的设置).

对不起,我是Rails的新手.任何帮助将不胜感激:o

ruby-on-rails rails-migrations

4
推荐指数
1
解决办法
3495
查看次数

索引名称太长 - Rails 3

我正在尝试运行此迁移:

class RemoveClientFromSalesteam < ActiveRecord::Migration
    change_table :sales_teams do |t|
        t.remove :client_id
    end
end
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

rake db:migrate
-- change_table(:sales_teams)
rake aborted!
An error has occurred, this and all later migrations canceled:

Index name 'temp_index_altered_sales_teams_on_client_priority_and_personal_priority' on table 'altered_sales_teams' is too long; the limit is 64 characters

Tasks: TOP => db:migrate
(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud)

这就是我的schema.rb样子:

  create_table "sales_teams", :force => true do |t|
    t.string   "name"
    t.integer  "firm_id"
    t.boolean  "client_priority"
    t.boolean  "personal_priority"
    t.datetime "created_at",        :null => false
    t.datetime …
Run Code Online (Sandbox Code Playgroud)

sqlite ruby-on-rails rails-migrations ruby-on-rails-3

4
推荐指数
1
解决办法
2639
查看次数

Rails将schema.rb时间戳更改为日期时间

与其他开发人员合作时,这个问题似乎一直在发生.我们有一个像这样的迁移创建的表(由postgres支持):

create_table :subscription_events do |t|
  t.integer :subscriber_id
  t.text :source_url
  t.text :params
  t.text :session

  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

然后在运行rake db:migrate之后的未来看似随机的时间点,Rails想要更新schema.rb文件datetime而不是使用timestamp,导致整个create_table调用的另外令人困惑的重新注册:

   create_table "subscription_events", :force => true do |t|
-    t.integer   "subscriber_id"
-    t.text      "source_url"
-    t.text      "params"
-    t.text      "session"
-    t.timestamp "created_at",    :limit => 6, :null => false
-    t.timestamp "updated_at",    :limit => 6, :null => false
+    t.integer  "subscriber_id"
+    t.text     "source_url"
+    t.text     "params"
+    t.text     "session"
+    t.datetime "created_at",    :null => false
+    t.datetime "updated_at",    :null …
Run Code Online (Sandbox Code Playgroud)

postgresql activerecord ruby-on-rails rails-migrations

4
推荐指数
1
解决办法
2925
查看次数

错误:找不到PostsController的操作'show'"

我一直在学习铁路

http://guides.rubyonrails.org/getting_started.html.

我在控制器中执行保存数据时遇到错误.运行博客时出现的错误是:"找不到PostsController的动作'show'"

**

我的posts_controller.rb代码是

**

class PostsController < ApplicationController
def new
end
def create
@post=Post.new(params[:post].permit(:title,:text))
@post.save
redirect_to @post
end

private
def post_params
params.require(:post).permit(:title,:text)
end

def show
@post=Post.find(params[:id])
end
end
Run Code Online (Sandbox Code Playgroud)

**

我的show.html.rb代码是

**

<p>
<strong> Title:</strong>
<%= @post.title %>
</p>
<p>
<strong> Text:</strong>
<%= @post.text %>
</p>
Run Code Online (Sandbox Code Playgroud)

**

create_posts.rb的代码

**

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :title
      t.text :text

      t.timestamps
    end
end
Run Code Online (Sandbox Code Playgroud)

请帮我解释为什么会出现这个错误

ruby-on-rails rails-migrations

4
推荐指数
1
解决办法
1万
查看次数

如何更新属性从非null以在rails迁移中允许null

我想从我的表中做一个非空的列,以通过rails迁移允许null?这该怎么做?我是否更改了创建表或创建新表的原始迁移?以及如何做到这一点.

ruby-on-rails rails-migrations

4
推荐指数
1
解决办法
3906
查看次数

我应该在回滚后删除迁移吗?

我对红宝石和铁轨都很陌生,而且我只是围绕着迁移.

我的问题是在回滚后删除迁移的最佳做法或时机是什么.到目前为止,我所看到的是回滚后是否删除迁移是一个问题,但在团队中工作时删除迁移是否有任何重大影响,离开迁移文件有什么好处而不是删除它?

在我的情况下最有意义的是什么?

我有我原来的迁移文件20140731141350_create_users.rb

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email
      t.string :password

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我需要添加一个salt列,所以我创建了迁移20140804125449_add_salt_colum_to_users.rb

class AddSaltColumToUsers < ActiveRecord::Migration
  def change
    add_column :users, :salt, :string
  end
end
Run Code Online (Sandbox Code Playgroud)

但在开发过程中,我意识到柱不是必需的并且已经完成

rake db:migrate:down VERSION=20140731141350
Run Code Online (Sandbox Code Playgroud)

现在我留下了一个未使用的20140804125449_add_salt_colum_to_users.rb迁移文件.

删除还是不?

ruby ruby-on-rails rails-migrations

4
推荐指数
1
解决办法
2740
查看次数

如何将更新CASCADE添加到Rails-Postgres迁移中?

我需要编写一个Rails迁移,该迁移将更新特定对象的uuid,然后通过将该ID作为外键存储的所有行进行CASCADE,如下所示:

alter table projects add constraint fk_league
foreign key (user_id) references users(id) on update cascade
Run Code Online (Sandbox Code Playgroud)

不幸的是,Rails似乎会自动生成约束:

fk_rails_e4348431a9
Run Code Online (Sandbox Code Playgroud)

我将如何编写上述sql来处理此问题?

sql postgresql ruby-on-rails foreign-keys rails-migrations

4
推荐指数
1
解决办法
1485
查看次数