如何使用引用同一个表的两个字段创建迁移?我有表A和图像.A.image1_id将参考图像,而A.image2_id也将参考图像.只有2张图片,而不是很多.如果我使用
class AddFields < ActiveRecord::Migration
def change
change_table(:ticket) do |t|
t.references :image1_id
t.references :image2_id
end
end
end
Run Code Online (Sandbox Code Playgroud)
我认为这不会起作用,因为它会在最后添加另一个_id,并且可能不会知道使用'image'模型.我也想过
change_table(:ticket) do |t|
t.references :image
Run Code Online (Sandbox Code Playgroud)
但是,我该如何添加其中两个呢?我还考虑过添加
create_table :images do |t|
t.belongs_to :ticket
t.string :file
Run Code Online (Sandbox Code Playgroud)
但我只想要2,而不是很多,这似乎不允许从票证中获取图像,如ticket.image1或ticket.image2.
根据这个文档http://apidock.com/rails/v3.2.8/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table这是我能找到的全部内容,t.references似乎也没有任何参数.
change_table(:suppliers) do |t|
t.references :company
end
Run Code Online (Sandbox Code Playgroud) 有人能给我一个简短的介绍,使用Mongoid在Rails中进行数据库迁移吗?我对每个文档迁移的懒惰特别感兴趣.这意味着,无论何时从数据库中读取文档,都要将其迁移到最新版本并再次保存.
有没有人以前做过这种事情?我遇到过mongoid_rails_migrations,但它没有提供任何类型的文档,虽然它看起来像这样做,但我真的不确定如何使用它.
我应该指出,我只是在概念上熟悉ActiveRecord迁移.
我有一个rails应用程序没有应用到我的schema.rb.迁移应该创建一个表:
class CreateUserGraphs < ActiveRecord::Migration
def change
create_table :user_graphs do |t|
t.string :name
t.string :content
t.integer :user_id
t.string :type_id
t.integer :upload_id
t.timestamps
end
add_index :user_graphs, [:user_id, :created_at]
end
end
Run Code Online (Sandbox Code Playgroud)
我做db:reset.然后我尝试了rake db:migrate:up VERSION = 123123123(这是迁移#).我在"开发"环境中.
为什么迁移不会影响schema.rb?
ruby-on-rails database-migration rails-migrations ruby-on-rails-4
我发现了几个关于编辑迁移的类似问题,但无法解决这个问题.我进行了rails迁移,然后打开了迁移文件并在该字段中添加了默认值选项.然后运行rake db:migrate.默认值按预期填充.然后稍后进行一些迁移,我决定要删除默认值选项.我怎么做?
如果这是我最后一次迁移,我会使用db:rollback并重新创建,但由于之前完成了一些迁移,我不知道如何解决这个问题.
感谢帮助.
我使用以下迁移创建了一个表:
class CreateProfilePictures < ActiveRecord::Migration
def change
create_table :profile_pictures do |t|
t.integer :user_id, null: false
t.integer :picture_id, null: false
t.timestamps null: false
end
add_index :profile_pictures, :user_id, unique: true
add_index :profile_pictures, :picture_id, unique: true
end
end
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下内容删除约束:
class FixProfilePic < ActiveRecord::Migration
def change
change_column :profile_pictures, :picture_id, :integer, unique: false
end
end
Run Code Online (Sandbox Code Playgroud)
如果我尝试在多个地方使用相同的picture_id,我仍然会遇到唯一的约束违规错误.从picture_id中删除唯一性约束的正确方法是什么?
我有一个可以正常运行的add_column迁移.但是,在运行它并启动控制台后,我会发现first_name和last_name列完全为空.我尝试使用save!而且它具有相同的效果 - 没有报告错误.这是原始的:
class UserAddFirstNameAndLastName < ActiveRecord::Migration
def change
# add column first name, last name string
add_column :users, :first_name, :string
add_column :users, :last_name, :string
User.all.each do |u|
u.first_name = 'first name'
u.last_name = 'last name'
u.save
end
end
end
Run Code Online (Sandbox Code Playgroud)
我还认为这可能是一些类加载问题,所以我插入行User以强制用户类在循环之前重新加载.没有骰子.
当我将其拆分为两次迁移时,实现了期望的效果.有人对此有解释吗?我发誓我甚至在过去迁移的同一个项目中做过这个.
其他说明:设计用户引擎,attr_accessible在运行迁移之前将新列添加到User类中.
activerecord ruby-on-rails rails-migrations ruby-on-rails-3 rails-activerecord
我是模拟导轨的新手.我知道如何创建模型以及如何向其添加列.现在我想将默认值设置为列,但我没有得到我究竟能做到的.
我生成了新模型
rails g model User
Run Code Online (Sandbox Code Playgroud)
然后在其中添加了列
rails generate migration AddNotificationEmailToUsers notification_email:boolean
Run Code Online (Sandbox Code Playgroud)
现在我想将Notification列的值默认设置为true.请指导我如何编写相同的迁移.谢谢!!!
最近我在Rails(5.0.0.1)上为Ruby(2.3.3)创建了一个应用程序:
$ rails _5.0.0.1_ new myapp --database=postgresql -T
Run Code Online (Sandbox Code Playgroud)
设置Gemfile并测试与我的数据库的连接后:
$ rails db:migrate
Run Code Online (Sandbox Code Playgroud)
我试图生成模型,但我收到了奇怪的消息:
$ rails g model Competition title:string
Expected string default value for '--test-framework'; got false (boolean)
Expected string default value for '--jbuilder'; got true (boolean)
Expected string default value for '--test-framework'; got false (boolean)
invoke active_record
create db/migrate/20161206021603_create_competitions.rb
create app/models/competition.rb
Run Code Online (Sandbox Code Playgroud)
这些消息的含义是什么?"预期的字符串默认值为......"?
提前致谢.
更新:我的Gemfile
source 'https://rubygems.org'
ruby '2.3.3'
gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
gem 'pg', '~> 0.18'
gem 'puma', '~> 3.0'
gem 'sass-rails', '~> 5.0' …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行以下向上迁移以更改"tweet"模型表中的"number"列
class ChangeDataTypeForTweetsNumber < ActiveRecord::Migration
def up
change_column :tweets do |t|
t.change :number, :integer
end
end
def down
change_table :tweets do |t|
t.change :number, :string
end
end
end
Run Code Online (Sandbox Code Playgroud)
执行以下向上迁移到heroku ....
heroku rake db:migrate:up VERSION=20120925211232
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
PG::Error: ERROR: column "number" cannot be cast to type integer
: ALTER TABLE "tweets" ALTER COLUMN "number" TYPE integer
Run Code Online (Sandbox Code Playgroud)
任何想法都会非常感激.
感谢大家.
有什么区别
t.boolean :is_live, index: true
Run Code Online (Sandbox Code Playgroud)
和
add_index :table_name, :is_live
Run Code Online (Sandbox Code Playgroud)
如果没有区别,那么为什么只能add_index在schema.rb中反映出来.当我使用时index: true,我实际上无法看到索引schema.rb.我应该只使用这种add_index方法.
使用该add_index方法时,我可以在schema.rb中看到这一点
add_index "table_name", ["is_live"], name: "index_table_name_on_is_live", using: :blahblah
Run Code Online (Sandbox Code Playgroud) rails-migrations ×10
activerecord ×3
heroku ×1
migration ×1
mongoid ×1
postgresql ×1
ruby ×1
sql ×1