标签: rails-migrations

在 activerecord 中自动重命名外键

我正在进行 Rails 迁移以重命名表,并且我想自动重命名其外键。例如 aUser有很多posts,我重命名UserPerson

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模型,例如,如本答案中所述。有没有更简单的方法?

ruby activerecord ruby-on-rails rails-migrations

3
推荐指数
1
解决办法
2569
查看次数

Rails 迁移——暂时忽略外键约束?

我正在尝试将表的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

3
推荐指数
1
解决办法
5766
查看次数

PostgreSQL 无法将类型 json 转换为字符变化[]

在我的 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

3
推荐指数
1
解决办法
6859
查看次数

Rails 与迁移的递归关联

我有一个名为 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)

我怎样才能轻松实现这一目标?

ruby-on-rails rails-migrations

3
推荐指数
1
解决办法
1667
查看次数

有没有办法将列更改为外键?

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?

ruby-on-rails rails-migrations

3
推荐指数
1
解决办法
4999
查看次数

如何将 has_one_attached 转换为 has_many_attached 到带有 has_one 附件的现有表?

我有一个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_attachedhas_many_attachedMessage

但当我运行时message.attachments.attached?它会返回false到现有附件。它适用于新附加的文件。

我应该添加迁移还是rake手动添加/转换附件的一次性任务?

这样做的正确方法是什么?

activerecord ruby-on-rails rails-migrations rails-activestorage

3
推荐指数
1
解决办法
1418
查看次数

Rails 中的迁移,空选项和可选选项之间的区别?

我正在努力学习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 的新手,但“约定优于配置”让我想了解执行此操作的正确方法。非常感谢!

database ruby-on-rails rails-migrations

3
推荐指数
1
解决办法
1553
查看次数

rails:rake db:create不创建新表

我正在开发一个现有的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命令之后我的更改消失了,它在命令行界面上没有显示任何内容.

我不知道我错过了什么.有人可以帮忙吗?

ruby-on-rails dbmigrate rails-migrations ruby-on-rails-3.2

2
推荐指数
1
解决办法
5288
查看次数

如何禁用Rails应用程序中的迁移功能?

背景

我们分别设计数据库模型和应用程序模型(RDMBS架构师与OOP工程师)。从我看到的关于Rails与域/密钥常规格式的关系来看,Rails迁移无法轻易复制设计良好的企业RDBMS的所有功能(如果有的话),因此我们不进行迁移,而是使用其他工具来构建数据库(永远不要介意对象关系阻抗不匹配的问题。数据完整性和数据库性能对我们来说太有价值,以至于任何开发人员都无法冒险更改RDBMS模型。

无论出于何种原因,我们现在都有一个Rails应用程序,该应用程序通过迁移进行了有害的数据库更改。如何在现有的Rails应用程序中彻底禁用此功能?

我有自己的理论,但我想知道世界的想法。

oop database-design ruby-on-rails rails-migrations rails-activerecord

2
推荐指数
2
解决办法
1948
查看次数

使用Rails迁移创建表时如何添加created_at和Updated_at

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

2
推荐指数
2
解决办法
5217
查看次数