1

我已经看到如何在 Rails 迁移中将可为空的列更改为不可为空?用于将不可为空的列添加到具有现有记录的现有数据库表的问题。因此,我正在考虑这样做以使用acts_as_list为模型添加位置可排序性:

class AddPositionToArticles < ActiveRecord::Migration[6.1]
  def change
    add_column :articles, :position, :integer
    Article.where(position: nil).each do |article|
      article.position = 0
      article.save!
    end
    change_column :articles, :position, :integer, null: false
  end
end

但是,这是不正确的,因为position需要根据相对于user记录的定位来递增,所以user.articles是根据预定义的位置进行排序的。

我如何在迁移中做到这一点?我acts_as_list在文章中添加时会自动发生吗?如此简单,我需要做的就是在迁移中重新保存记录(而不是设置位置)?

我如何确保它们按照开始时的顺序排列?

4

1 回答 1

1
class AddPositionToArticles < ActiveRecord::Migration[6.1]
  def change
    add_column :articles, :position, :integer
    User.find_each do |user|
      user.articles.order(created_at: :asc).find_each.with_index do |article, index|
        article.update_columns(position: index)
      end
    end
    change_column :articles, :position, :integer, null: false
  end
end
于 2021-08-20T19:12:57.377 回答