我尝试在迁移过程中将数据从一个表移动到另一个表,同时添加新列。我的用户模型有列电话和phone_permission,我想移动到图库模型(包括其数据)。我的代码:
def self.up
add_column :galleries, :phone, :string
add_column :galleries, :phone_permission, :integer, default: 1
execute "UPDATE galleries AS g, users AS u SET g.phone = u.phone WHERE u.id = g.user_id"
execute "UPDATE galleries AS g, users AS u SET g.phone_permission = u.phone_permission WHERE u.id = g.user_id"
remove_column :users, :phone
remove_column :users, :phone_permission
end
错误:SQLite3 :: SQLException:near" AS":语法错误:UPDATE画廊AS g,用户AS u SET g.phone = u.phone WHERE u.id = g.user_id
感谢您的帮助!
答案 0 :(得分:1)
上面的代码对于SQLite来说不是有效的SQL。
另外,为什么不使用ActiveRecord呢?这样的事情可以解决问题:
Gallery.joins(:user).update_all('galleries.phone = users.phone')
Gallery.joins(:user).update_all('galleries.phone_permission = users.phone_permission')
编辑:update_all
的{{3}}状态
此方法构造单个SQL UPDATE语句并将其直接发送到数据库。它不会实例化所涉及的模型,也不会触发Active Record回调或验证。
在我看来,这只是编写Raw SQL的一种更漂亮的方式。
编辑2:正如@llya在评论中指出的那样,如果您要更改模型名称,您的迁移将会中断。这里的一个简单技巧是在迁移之上添加此类定义:
class Gallery < ActiveRecord::Base; end