Я работаю над плагином для 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, но я не знаю, каким будет лучший следующий шаг. Есть ли способ расширить или безопасно переопределить один из этих методов, чтобы обеспечить функциональность, которую я ищу (желательно только для определенных ассоциаций), или есть другой, лучший подход для этого?