在rails我有移民改变生产数据以适应新的验证规则,有几个错误,所以我有2个不同的迁移(它们可能是一个但仍然是两个方面单独运行)一个失败,因为其他验证不满足和副反之亦然
验证是模型中的新功能
validates_uniqueness_of :job_id , :scope => [:day, :time, :user_id , :overtime, :comments] , :message => "Duplicate Entry, Please check your data"
validates_uniqueness_of :job_id , :scope => [:day, :user_id, :comments] , :message => "Has 2 Entires for same job on same day with same comment"
Run Code Online (Sandbox Code Playgroud)
是一种全新的,另一种只是从24变为8并添加了加时位
validates_numericality_of :time, :greater_than => 0, :less_than_or_equal_to => 8
validates_numericality_of :overtime, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 16
Run Code Online (Sandbox Code Playgroud)
我试着重新订购迁移,我得到了相反的结果.
有没有办法,除了先更新数据库,然后更新这个文件,以绕过它?或者这就是我应该做的事情?
如何以当前的RAILS_ENV为条件进行Rails迁移?
具体来说,我想:
这样做将允许我们通过迁移执行数据库更新 - 这是我们在Staging环境中只需要的.一个示例是为特定帐户或帐户类激活功能以用于测试目的.
我在Rails 3.1.3中创建了一个新引擎,显然有一个rake任务可以复制所有迁移.我试过以下rake abc:install:migrations扔了:
rake aborted!
Don't know how to build task 'abc:install:migrations'
(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud)
我也试过rake abc_engine:install:migrations了同样的结果.
然后我读bundle exec rake railties:install:migrations或bundle exec rake railties:install:migrations FROM=abc_engine应该做的伎俩,但没有成功.即使没有抛出任何错误,也没有复制任何内容.
我的迁移位于引擎文件夹中的db/migrate /中,我从spec/dummy /运行上面的所有命令
有谁知道如何使用这个新的rake任务来从引擎复制迁移?
rake ruby-on-rails rails-migrations rails-engines ruby-on-rails-3.1
所以我对Rails真的很新,而且我得到了一个我不理解的奇怪错误.我创建了一个Event模型,我想将它迁移到我的数据库.但是,当我运行时,bundle exec rake db:migrate --trace这就是我得到的:
05:55 PM movienights: bundle exec rake db:migrate --trace
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Invoke rails_env (first_time)
** Execute rails_env
** Execute db:load_config
** Execute db:migrate
== CreateEvents: migrating ===================================================
-- create_table(:events)
rake aborted!
An error has occurred, all later migrations canceled:
undefined method `name' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x007ffa75a27660>
Documents/Homework/College/2011-2012/Rails/RailsApps/movienights/db/migrate/20120331213639_create_events.rb:4:in `block in change'
.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/schema_statements.rb:160:in `create_table'
.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:432:in `create_table'
.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/migration.rb:450:in `block in method_missing'
.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/migration.rb:424:in `block in say_with_time' …Run Code Online (Sandbox Code Playgroud) 在开始一个新项目时,模型中有很多变化,我发现很容易编辑现有的迁移和运行,db:clean或者db:reset创建新的迁移.当应用程序没有达到生产时我这样做,这意味着我可以重置/清理数据库而不用担心我正在独自工作或者是小团队的一部分.
但是今天,我在Rails指南中遇到了以下建议,说它不是一个好主意并且不鼓励编辑现有的迁移:
编辑现有迁移不是一个好主意:如果现有版本的迁移已经在生产机器上运行,那么您将为自己和同事创建额外的工作并导致严重的麻烦.相反,您应该编写一个新的迁移来执行您需要的更改.编辑尚未提交到源代码控制的新生成的迁移(或者更常见的是,尚未在开发计算机之外传播的迁移)相对无害.
我想知道:
我正在阅读Rails Test Prescriptions一书,在设置过程中,它要求我将迁移文件更改为以下内容:
class ProjectUserJoin < ActiveRecord::Migration
def self.up
create_table :projects_users, :force => true, :id => false do |t|
t.references :project
t.references :user
t.timestamps
end
end
def self.down
drop_table :projects_users
end
end
Run Code Online (Sandbox Code Playgroud)
看起来我在Rails(4.0.0)上使用的是比书(2或3.x)更高的版本,我的迁移文件如下所示:
class ProjectUserJoin < ActiveRecord::Migration
def change
end
end
Run Code Online (Sandbox Code Playgroud)
如何编辑更改方法以执行与上述上下方法相同的操作?到目前为止,我尝试使用up和down而不是self.up和self.down并使用相同的代码进行复制.那没起效.
谢谢!
在迁移时,我收到以下错误消息:
PG::UndefinedTable: ERROR: relation "actioncodes" does not exist
: ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_4ecaa2493e"
FOREIGN KEY ("actioncode_id")
REFERENCES "actioncodes" ("id")
Run Code Online (Sandbox Code Playgroud)
我有以下组织的迁移文件:
class CreateOrganizations < ActiveRecord::Migration
def change
create_table :organizations do |t|
t.string :name, null: false, limit: 40
t.references :actioncode, index: true, foreign_key: true
t.boolean :activated
t.datetime :activated_at
t.timestamps null: false
end
end
end
Run Code Online (Sandbox Code Playgroud)
对于Actioncodes,我有迁移文件:
class CreateActioncodes < ActiveRecord::Migration
def change
create_table :actioncodes do |t|
t.string :code, null: false, limit: 20
t.string :description, limit: 255
t.timestamps null: false
end
end …Run Code Online (Sandbox Code Playgroud) 简洁版本:
移民怎么了down?在什么情况下您需要使用它?
长版:
许多支持数据库模式版本的框架(包括但不限于Rails的“迁移”)允许开发人员指定如何up反转数据升级(操作down),甚至通过分析代码自动生成降级操作(如 Rails 的change方法)。
事实上,在我遇到的所有 Rails 迁移代码中这样做似乎非常常见,这让我想知道这是否被认为是最佳实践。
就我个人而言,我从来没有需要降级数据库模式,而且我无法想象我想要的合理场景,无论是在开发还是生产中。我的经历似乎与普遍的down迁移不一致,所以我猜我错过了一些东西......
a 在哪些最常见的场景中down有用?
ruby-on-rails database-migration database-schema rails-migrations
可以使用rails 4或rails 5中的change_columns回滚迁移:
def change
change_column etc
end
Run Code Online (Sandbox Code Playgroud)
我应该使用上下方法吗?
ruby-on-rails rails-migrations ruby-on-rails-4 rails-activerecord ruby-on-rails-5
我碰巧删除了迁移,我不想还原这些已删除的迁移.
这是rake db:migrate:status产生:
Status Migration ID Migration Name
------------------------------------------------------
up 0 ********** NO FILE *********
up 20150209023430 Create users
up 20150320184628 ********** NO FILE **********
up 20150322004817 Add roles to users
up 20150403190042 ********** NO FILE **********
Run Code Online (Sandbox Code Playgroud)
rake db:migraterake db:rollback由于缺少文件,命令将无法工作.
我没有意图丢失我的数据,所以我不想使用rake db:drop或rake db:reset.
我能做些什么来执行迁移和回滚以及如何摆脱丢失的文件?
migration ruby-on-rails rails-migrations ruby-on-rails-3 ruby-on-rails-4
rails-migrations ×10
ruby-on-rails ×10
ruby ×4
rake ×2
migration ×1
postgresql ×1
validation ×1