嘿伙计们我只想撤消一个迁移文件,比如说
rake db:rollback VERSION = $ TIMESTAMP
这个命令不起作用,有什么建议吗?
我有以下ActiveRecord迁移:
class CreateSubjects < ActiveRecord::Migration
def self.up
create_table :subjects do |t|
t.string :title
t.timestamps
end
change_table :projects do |t|
t.references :subjects
end
end
def self.down
drop_table :subjects
remove_column :projects, :subjects_id #defeats the purpose of having references
end
end
Run Code Online (Sandbox Code Playgroud)
我其实喜欢这种references风格.不幸的是我找不到references该self.down部分中的回滚等价物.如果我写,remove_column :projects, :subjects_id我也可以写t.integer :subjects_id,这将使它更安全.
我正在尝试在论坛主题上添加"粘性"选项.这就是我的迁移方式
def self.up
add_column :topics, :sticky, :boolean, :null => false, :default => false
end
def self.down
remove_column :topics, :sticky
end
Run Code Online (Sandbox Code Playgroud)
这在mysql上本地完美,但当我将更改推送到heroku(使用PostgreSQL)时,这是我在使用控制台时得到的
>> t.sticky
=> "f"
>> t.sticky.class
=> String
>> t.sticky = true
=> true
>> t.sticky.class
=> TrueClass
Run Code Online (Sandbox Code Playgroud)
为什么此属性的默认值为String?
编辑:如果我保存对象,它不会改变粘性属性,即它仍然是"f".
postgresql ruby-on-rails heroku rails-migrations ruby-on-rails-3
我正在创建一个新的Rails 3.1应用程序.我希望这个新应用程序重用现有数据库(由以前的rails 2应用程序创建).
我创建了定义模型的新应用程序,它重用了数据库中的一些现有数据.
在开发和测试阶段,一切正常,因为它在一个干净的工作表数据库上运行,但在尝试部署到生产时,我得到的消息如下:
PGError: ERROR: column "email" of relation "users" already exists
*** [err :: localhost] : ALTER TABLE "users" ADD COLUMN "email" character varying(255) DEFAULT '' NOT NULL
Run Code Online (Sandbox Code Playgroud)
但是我在迁移中的想法就像
class DeviseCreateUsers < ActiveRecord::Migration
def change
change_table(:users) do |t|
t.database_authenticatable :null => false
t.recoverable
t.rememberable
t.trackable
t.timestamps
end
end
Run Code Online (Sandbox Code Playgroud)
如何使db:migrate忽略已存在的内容并仅更改新内容和/或新类型?
我在stackoverflow上看到了类似的问题,但没有人回答这个问题.谢谢你的回答.
我正在尝试运行rails迁移,我看到错误"密钥规范中使用的BLOB/TEXT列没有密钥长度"......但是,我在迁移类中指定了长度.从迁移生成SQL语句时,Rails似乎忽略了这一点.有线索吗?
这是我的迁移类:
class AddIndexToAccounts < ActiveRecord::Migration
def self.up
add_index :TACCOUNT, :NAMEX, :length => 5
end
def self.down
remove_index :TACCOUNT, :NAMEX
end
end
Run Code Online (Sandbox Code Playgroud)
这是错误输出.它似乎已经看到了长度规范,但它在它生成的SQL语句中不存在:
** [out :: 192.168.10.7] -- add_index(:TACCOUNT, :NAMEX, {:length=>5})
** [out :: 192.168.10.7] rake aborted!
** [out :: 192.168.10.7] An error has occurred, all later migrations canceled:
** [out :: 192.168.10.7]
** [out :: 192.168.10.7] Mysql::Error: BLOB/TEXT column 'NAMEX' used in key specification without a key length: CREATE INDEX `index_TACCOUNT_on_NAMEX` ON `TACCOUNT` (`NAMEX`)
Run Code Online (Sandbox Code Playgroud) 我正在运行rake db:structure:load但是在加载所有结构后,它无法在schema_migrations中插入版本.
看起来PostgreSQL不知道最近创建的表.已经谷歌搜索,但没有找到任何有用的东西.
我试图在我的rails博客中添加标记模型.但是我意外地生成了一个"Tags.rb"模型而不是"Tag.rb",在阅读了指南之后,我意识到制作"标签"复数在模型方面是个错误.我使用了回滚迁移
rake db:rollback
Run Code Online (Sandbox Code Playgroud)
然后
rails destroy model Tags.rb
Run Code Online (Sandbox Code Playgroud)
这就是我回来的原因
invoke active_record
remove /home/migration/templates/create_table_migration.rb
remove app/models/tags.rb.rb
invoke test_unit
remove test/models/tags.rb_test.rb
remove test/fixtures/tags.rbs.yml
Run Code Online (Sandbox Code Playgroud)
当我回到模型文件夹,虽然它仍然存在.请帮忙 :)
将应用程序从Rails 2.3.17迁移到3.2.21时..link_to_remote在使用MiniTest进行测试时,我们遇到了Rails遗留表单帮助程序的问题.
在旧版本的rails中,我们使用了在Rails 3中删除的link_to_remote表单助手.为了提供支持,我们在我们的应用程序中添加了prototype_legacy_helper插件,该插件在UI中运行良好,但测试失败并抛出错误,如下所示:
NoMethodError: undefined method `link_to_remote' for #<ApplicationHelperTest:0xc800dd4>
Run Code Online (Sandbox Code Playgroud)
这是我们在ApplicationHelper中的代码
def reservation_menu_command_link(command, *args)
...
command_link = link_to_remote(anchor_text,options = {}, {:class => style_class})
...
end
Run Code Online (Sandbox Code Playgroud)
这是我们对application_helper测试的测试用例
def test_reservation_menu_command_link
options = { :lodging_view => lv}
assert_equal(%q{xyz}, reservation_menu_command_link(:cancel_all_possible, options))
end
Run Code Online (Sandbox Code Playgroud)
所以你可以看到我们有一个方法reservation_menu_command_link,我们在我们的UI中使用它,工作正常,但测试此定义失败.
任何人都可以帮助我摆脱插件的这种行为吗?
我刚刚开始学习rails,如果对此的答案很明显,那么我感到抱歉。
我在我的应用程序中添加了帖子和类别表的迁移,现在使用以下行在默认值不为null的情况下添加对帖子表中类别的引用:
add_reference :posts, :category, index: true, foreign_key: true, null: false
Run Code Online (Sandbox Code Playgroud)
但是在运行迁移时出现以下错误:
SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "posts" ADD "category_id" integer NOT NULL
Run Code Online (Sandbox Code Playgroud)
我曾尝试阅读过api,但无法弄清楚我在做什么错。
我有一个使用活动管理员进行生产设计的应用程序。我尝试添加user_role到表中admin_users。我还想验证在创建新的管理员用户时是否选择了角色名称。所以我添加validates :role_id, :presence => true了Rails模型。
当我在旧数据库上运行新迁移时,一切正常。但是,当我尝试从头开始应用迁移时,由于模型中添加了验证,导致未定义的方法错误,导致创建admin用户的旧迁移失败。
从UI创建管理员用户时,无需更改旧的迁移,也无需进行验证,是否有可能克服这种情况