gpt4 book ai didi

sql - Ruby on Rails : writing a migration to move a column to another table, 合并重复项,然后匹配 ID

转载 作者:行者123 更新时间:2023-12-04 15:47:06 26 4
gpt4 key购买 nike

我坚持写这个迁移。

目前我有一个建筑物表。它将建筑物的城市列为一列。

(城市列中有重复的城市名称。)

  create_table "building", force: true do |t|
t.string "name"
t.string "city"
t.datetime "created_at"
t.datetime "updated_at"
end

我现在已经创建了一个城市模型,即 has_many :buildings .

现在的建筑物 belongs_to :city .

我添加了一个新专栏 city_id到建筑物 belongs_to协会。
  create_table "city", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "city", ["name"], name: "index_cities_on_name", unique: true

我正在尝试编写将执行以下操作的迁移:

1. 将建筑物表中的“城市”列复制到城市表中的“名称”列。

2. 合并城市名称栏中所有重复的城市

3.将建筑物表中的“city_id”列匹配到正确的城市

但我完全被困住了……我已经浏览了 ActiveRecords 文档一个小时了,但我仍然不太确定该怎么做。任何帮助将不胜感激!谢谢!

最佳答案

我不会在 ActiveRecord 中进行数据迁移。在迁移中直接引用 ActiveRecord 模型类存在向前兼容性问题。作为一般规则,我尽量避免使用 id。所以我会回到SQL。

不确定你使用的是什么数据库,但这样的东西应该适用于 MySQL:

execute("INSERT INTO cities(name, created_at, updated_at) SELECT DISTINCT city, NOW(), NOW() FROM buildings;")
execute("UPDATE buildings SET buildings.city_id = (SELECT city_id FROM cities where cities.name = buildings.name);")

第一条语句初始化没有重复的城市表,而第二条语句在建筑物上设置 city_id 列。

类似的语句(可能语法略有不同)适用于其他数据库。

关于sql - Ruby on Rails : writing a migration to move a column to another table, 合并重复项,然后匹配 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com