我正在进行 Rails 迁移以重命名表,并且我想自动重命名其外键。例如 aUser有很多posts,我重命名User为Person
def change
rename_table :users, :people
end
Run Code Online (Sandbox Code Playgroud)
我想创建自动迁移,例如
def change
rename_column :posts, :user_id, :person_id
end
Run Code Online (Sandbox Code Playgroud)
我想过从迁移中获取模型并查看其has_many模型,例如,如本答案中所述。有没有更简单的方法?
我正在尝试将表的id字段更改为uuid
这是我的代码:
class AddUuidToProjects < ActiveRecord::Migration[5.0]
def up
add_column :projects, :uuid, :string, limit:36, null: false, first: true
add_column :projects, :old_id, :integer
Project.all.each do |p|
p.update!(old_id: p.id)
end
change_table :projects do |t|
t.remove :id
t.rename :uuid, :id
end
execute "ALTER TABLE projects ADD PRIMARY KEY (id);"
Project.all.each do |p|
# has_one image
Image.find(p.old_id).update!(project: p)
# has_many stories
Story.where(project_id: p.old_id).each do |s|
s.update!(project: p)
end
end
end
...
end
Run Code Online (Sandbox Code Playgroud)
t.remove :id由于外键约束,此迁移在尝试时中断。错误信息是:
Mysql2::Error: Cannot drop column 'id': needed in …Run Code Online (Sandbox Code Playgroud) mysql ruby-on-rails foreign-keys rails-migrations ruby-on-rails-5
在我的 Rails 5.0.5 应用程序中,我需要将json列转换为string, array: true.
我的列中的值json如下:
[ "200px-RR5219-0015R.png", "2017_03_25_2235.doc", "137555.jpg" ]
Run Code Online (Sandbox Code Playgroud)
我尝试过这个迁移:
[ "200px-RR5219-0015R.png", "2017_03_25_2235.doc", "137555.jpg" ]
Run Code Online (Sandbox Code Playgroud)
并得到这个错误:
ActiveRecord::StatementInvalid: PG::DatatypeMismatch: ERROR: column "attachments" cannot be cast automatically to type character varying[]
HINT: You might need to specify "USING attachments::character varying[]".
: ALTER TABLE "tasks" ALTER COLUMN "attachments" TYPE character varying[]
Run Code Online (Sandbox Code Playgroud)
然后我编辑了迁移:
class ChangeTaskAttachmentsTypeToString < ActiveRecord::Migration[5.0]
def change
change_column :tasks, :attachments, :string, array: true
end
end
Run Code Online (Sandbox Code Playgroud)
最后得到这个错误:
PG::CannotCoerce: ERROR: cannot cast type json to …Run Code Online (Sandbox Code Playgroud) postgresql ruby-on-rails rails-migrations postgresql-9.3 ruby-on-rails-5
我有一个名为 Nodes 的表。每个节点属于同一张表的一个父亲,并且在同一张表上也有一个孩子。这是节点模型:
class Node < ApplicationRecord
belongs_to :parent # I tried using :node instead of :parent
has_one :children # Same than above
end
Run Code Online (Sandbox Code Playgroud)
我怎样才能轻松实现这一目标?
project_id我在表中有一个名为内容的现有列。它应该是一个引用项目表中项目的外键。然而,无论是谁设置了数据库,都创建了内容表,而没有将project_id 设置为foreign_key。
我尝试创建迁移:
def change
add_reference :contents, :project
end
Run Code Online (Sandbox Code Playgroud)
但这尝试添加一个project_id已经存在的列。
我的问题是,有没有办法(使用迁移)将列更改project_id为foreign_key?
我有一个Message模型
class Message < ApplicationRecord
has_one_attached :attachment
Run Code Online (Sandbox Code Playgroud)
但现在我需要将其转换为:
class Message < ApplicationRecord
has_many_attached :attachments
Run Code Online (Sandbox Code Playgroud)
为消息启用多个附件所以我在模型中更改has_one_attached为has_many_attachedMessage
但当我运行时message.attachments.attached?它会返回false到现有附件。它适用于新附加的文件。
我应该添加迁移还是rake手动添加/转换附件的一次性任务?
这样做的正确方法是什么?
activerecord ruby-on-rails rails-migrations rails-activestorage
我正在努力学习Rails,并且发现细节才是你以后真正能够让自己沉沦的地方。当我创建一个非常简单的存储时,进行迁移时,我有一些属于可选的对象关系。当我在阅读时试图更好地理解 null :
了解 Rails 迁移语句 (:null => false)
我想到使用 null: true 会允许该列为空,并且我找不到解决以下之间差异的任何信息/问题:
create_table :items do |t|
...
t.belongs_to :shopping_cart, null: true
...
end
Run Code Online (Sandbox Code Playgroud)
和
create_table :items do |t|
...
t.belongs_to :shopping_cart, optional: true
...
end
Run Code Online (Sandbox Code Playgroud)
对于这种可选关系,我应该做什么,我是 Ruby/Rails 的新手,但“约定优于配置”让我想了解执行此操作的正确方法。非常感谢!
我正在开发一个现有的rails项目,我必须在其中添加一个新选项卡.好吧,我已经编写了所有相应的模型,视图和控制器,然后更改了schema.rb文件以创建新表.
create_table "ryan_indices", :force => true do |t|
t.string "name"
end
create_table "benchmark_indices", :force => true do |t|
t.string "name"
end
Run Code Online (Sandbox Code Playgroud)
这是我的部分schema.rb文件.第一张桌子就在那里.我只是想添加一个类似的新表,我为其创建了模型,视图和控制器,并在schema.rb文件中添加了那些create_table语句.但是,当我运行rake db:migrate它时不会创建新表.而且schema.rb file goes back to previous state我的意思是在我运行rake db:migrate命令之后我的更改消失了,它在命令行界面上没有显示任何内容.
我不知道我错过了什么.有人可以帮忙吗?
背景
我们分别设计数据库模型和应用程序模型(RDMBS架构师与OOP工程师)。从我看到的关于Rails与域/密钥常规格式的关系来看,Rails迁移无法轻易复制设计良好的企业RDBMS的所有功能(如果有的话),因此我们不进行迁移,而是使用其他工具来构建数据库(永远不要介意对象关系阻抗不匹配的问题。数据完整性和数据库性能对我们来说太有价值,以至于任何开发人员都无法冒险更改RDBMS模型。
题
无论出于何种原因,我们现在都有一个Rails应用程序,该应用程序通过迁移进行了有害的数据库更改。如何在现有的Rails应用程序中彻底禁用此功能?
我有自己的理论,但我想知道世界的想法。
oop database-design ruby-on-rails rails-migrations rails-activerecord
Rails g migration CreateFoo
Run Code Online (Sandbox Code Playgroud)
这不会将created_at和update_at添加到迁移中。有没有一种方法可以生成迁移并添加时间戳作为参数?
Rails g migration CreateFoo timestamps 没用。
activerecord rails-migrations ruby-on-rails-3 ruby-on-rails-4
rails-migrations ×10
activerecord ×3
database ×1
dbmigrate ×1
foreign-keys ×1
mysql ×1
oop ×1
postgresql ×1
ruby ×1