Saving the order of associated records in a Rails has_many :through association

Я работаю над плагином для Rails, который включает способ изменения порядка ассоциированных записей в has_many :through association. Скажем, у нас есть следующие модели:

class Playlist < ActiveRecord::Base
  has_many :playlists_songs, :dependent => :destroy
  has_many :songs, :through => :playlists_songs
end

class Song < ActiveRecord::Base
  has_many :playlists_songs, :dependent => :destroy
  has_many :playlists, :through => :playlists_songs
end

class PlaylistsSong < ActiveRecord::Base
  belongs_to :playlist
  belongs_to :song
end

Если мы меняем порядок песен в плейлисте (например, @playlist.songs.rotate! ), Rails не трогает записи в таблице playlists_songs (я использую Rails 3.1), что вполне логично. Однако я бы хотел, чтобы любой вызов метода songs= в Playlist сохранял порядок песен, возможно, либо удалив соответствующие существующие строки в playlists_songs и создав новые в нужном порядке (чтобы :order => "id" можно было использовать при их извлечении), либо добавив в playlists_songs колонку sort:integer и обновив эти значения соответствующим образом.

Я не увидел никаких обратных вызовов (например, before_add), которые позволили бы это сделать. В ActiveRecord::Associations::CollectionAssociation, соответствующие методы, кажется, writer, replace и replace_records, но я не знаю, каким будет лучший следующий шаг. Есть ли способ расширить или безопасно переопределить один из этих методов, чтобы обеспечить функциональность, которую я ищу (желательно только для определенных ассоциаций), или есть другой, лучший подход для этого?

7
задан Tom 11 October 2011 в 03:42
поделиться