1

我正在尝试添加acts_as_list到我的数据库中的现有playlists表中,该表存储我的用户可能创建的所有播放列表。目标是允许用户对自己的播放列表进行排序。

此迁移将为表中的播放列表设置默认位置,但该位置将在全局上下文中设置(例如,position对于其中包含 500 个播放列表的表,该列将按 1-500 排序):

class AddPositionToPlaylistsTable < ActiveRecord::Migration
  def self.up
    add_column  :playlists, :position, :integer
    Playlist.reset_column_information
    playlist = Playlist.find(:all, :order => "created_at ASC")

    playlist.each_with_index do |p, i|
      p.position = i+1
      p.save
    end

  end

  def self.down
    remove_column :playlists, :position
  end
end

这个顺序会有问题,因为将项目的位置从 500 移动到 499 不一定反映从用户的角度来看的任何变化(因为他们可能有具有 50、70、100position和 500 的播放列表)。

相反,我想在每个用户上下文中为表中的每个播放列表设置一个位置(例如,假设每个用户有 5 个播放列表,该position列将有多个播放列表实例,每个用户按 1-5 排序)。

这是否可能,如果可以,我将如何修改我的迁移来实现这一点?

4

1 回答 1

1

更新播放列表位置时,您只考虑用户的播放列表。所以你应该从一开始就这样做。在您的迁移up- 方法中,您可以获取每个用户的所有播放列表,然后像您一样增加索引:

#....
User.all.each do |user|
  user_playlists = user.playlists(:order => "created_at ASC")

  user_playlists.each_with_index do |p, i|
    p.position = i+1
    p.save
  end
end
于 2012-07-02T22:18:16.817 回答