通过Rails迁移删除数据库表列的语法是什么?
用户有很多上传.我想在uploads
引用该表的表中添加一列user
.迁移应该是什么样的?
这就是我所拥有的.我不确定是否应该使用(1):user_id, :int
或(2):user, :references
.我甚至不确定(2)是否有效.只是试图以"轨道"的方式做到这一点.
class AddUserToUploads < ActiveRecord::Migration
def change
add_column :uploads, :user_id, :integer
end
end
Run Code Online (Sandbox Code Playgroud)
除Rails之外的相关问题3. Rails 3迁移:添加引用列?
ruby-on-rails rails-migrations ruby-on-rails-4 rails-activerecord
我有问题,我在Rails中有一个迁移设置列的默认设置,如下例所示:
def self.up
add_column :column_name, :bought_at, :datetime, :default => Time.now
end
Run Code Online (Sandbox Code Playgroud)
假设,我想在以后的迁移中删除默认设置,如何使用rails迁移?
我目前的解决方法是在rails迁移中执行自定义sql命令,如下所示:
def self.up
execute 'alter table column_name alter bought_at drop default'
end
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种方法,因为我现在依赖于底层数据库如何解释这个命令.如果数据库发生更改,此查询可能不再起作用,迁移将被破坏.那么,有没有办法表示在rails中删除列的默认设置?
我有一个rake任务,除非存在一个表,否则它将无效.我正在一个网站上与20多名工程师一起工作,所以我想确保他们已经迁移了表,然后才能执行一个rake任务,该任务将填充相应的表.
AR有这样的方法Table.exists
吗?如何确保他们已成功迁移表?
我需要将时间戳(created_at updated_at)添加到现有表.我尝试了以下代码,但它没有用.我也尝试过我在网上找到的其他解决方案,但它们也不起作用.
class AddTimestampsToUser < ActiveRecord::Migration
def change_table
add_timestamps(:users)
end
end
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
t.references
和之间有什么区别t.belongs_to
?为什么我们有这两个不同的词?在我看来他们做同样的事情?试过一些谷歌搜索,但没有找到解释.
class CreateFoos < ActiveRecord::Migration
def change
create_table :foos do |t|
t.references :bar
t.belongs_to :baz
# The two above seems to give similar results
t.belongs_to :fooable, :polymorphic => true
# I have not tried polymorphic with t.references
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud) 我有一个Products表,想要添加一列:
t.references :imageable, :polymorphic => true
Run Code Online (Sandbox Code Playgroud)
我试图通过以下方式为此生成迁移:
$ rails generate migration AddImageableToProducts imageable:references:polymorphic
Run Code Online (Sandbox Code Playgroud)
但我显然做错了.任何人都可以提出任何建议吗?谢谢
当我在生成迁移后尝试手动将其放入时,我这样做:
class AddImageableToProducts < ActiveRecord::Migration
def self.up
add_column :products, :imageable, :references, :polymorphic => true
end
def self.down
remove_column :products, :imageable
end
end
Run Code Online (Sandbox Code Playgroud)
它仍然没有奏效
我想migration
在Rails中创建一个引用另一个表.通常,我会这样做:
add_column :post, :user, :references
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为列user_id
在posts
表中.但是,如果,而不是user_id
,我想要的东西author_id
呢?我怎样才能做到这一点?
如何回滚失败的rails迁移?我希望这rake db:rollback
会撤消失败的迁移,但不会,它会回滚先前的迁移(失败的迁移减去一次).而且rake db:migrate:down VERSION=myfailedmigration
也不起作用.我已经碰到了几次,这非常令人沮丧.这是我为复制问题所做的简单测试:
class SimpleTest < ActiveRecord::Migration
def self.up
add_column :assets, :test, :integer
# the following syntax error will cause the migration to fail
add_column :asset, :test2, :integer
end
def self.down
remove_column :assets, :test
remove_column :assets, :test2
end
end
Run Code Online (Sandbox Code Playgroud)
结果:
== SimpleTest: migrating ===================================================== -- add_column(:assets, :test, :integer) -> 0.0932s -- add_column(:asset, :error) rake aborted! An error has occurred, all later migrations canceled: wrong number of arguments (2 for 3)
好吧,让我们回滚:
$ rake db:rollback == …