我有一个Project模型,它有依赖项,并且数据库中已经有记录。
我想将Project.id(它的主键)更改为 UUID,而不仅仅是递增整数。
如何编写一个迁移来更改 id、更新现有记录以具有 UUID 以及更新其他表外键中的引用?
我已经用很多表(大约40个)定义了我的数据库.我现在意识到我想在每个表中添加某些列.为了这个例子,让它成为
created_by和 updated_by.
有没有办法在不进行40次迁移的情况下轻松完成这些操作并手动更新每个迁移?
我正在使用rails 2.3.8
我有以下迁移:
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 => …
我有一个运行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
我正在尝试运行此迁移:
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) 与其他开发人员合作时,这个问题似乎一直在发生.我们有一个像这样的迁移创建的表(由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) 我一直在学习铁路
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)
请帮我解释为什么会出现这个错误
我想从我的表中做一个非空的列,以通过rails迁移允许null?这该怎么做?我是否更改了创建表或创建新表的原始迁移?以及如何做到这一点.
我对红宝石和铁轨都很陌生,而且我只是围绕着迁移.
我的问题是在回滚后删除迁移的最佳做法或时机是什么.到目前为止,我所看到的是回滚后是否删除迁移是一个问题,但在团队中工作时删除迁移是否有任何重大影响,离开迁移文件有什么好处而不是删除它?
在我的情况下最有意义的是什么?
我有我原来的迁移文件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迁移文件.
删除还是不?
我需要编写一个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来处理此问题?
rails-migrations ×10
ruby-on-rails ×10
activerecord ×2
postgresql ×2
ruby ×2
foreign-keys ×1
sql ×1
sqlite ×1