1

acts_as_listデータベース内の既存のテーブルに追加しようとしplaylistsています。このテーブルには、ユーザーが作成した可能性のあるプレイリストが保存されています。目標は、ユーザーが自分のプレイリストを並べ替えることができるようにすることです。

この移行により、テーブル内のプレイリストのデフォルトの位置が設定されますが、位置はグローバルコンテキストで設定されます(たとえば、position500個のプレイリストを含むテーブルの列は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、100 position、および500のプレイリストがある場合があるため)。

代わりに、ユーザーごとのコンテキストでテーブル内の各プレイリストの位置を設定します(たとえば、各ユーザーに5つのプレイリストがあるとすると、position列には、ユーザーごとに1〜5の順序でプレイリストの複数のインスタンスがあります)。

これは可能ですか?もしそうなら、これを達成するために移行をどのように変更しますか?

4

1 に答える 1

1

プレイリストの位置を更新するときは、ユーザーのプレイリストのみを考慮します。だから最初からやるべき。移行のup-method では、ユーザーごとにすべてのプレイリストを取得してから、次のようにインデックスを増やすことができます。

#....
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 に答える