我有两个模型,Song 和 Show。一个节目是一个有序的歌曲列表,其中同一首歌曲可以被多次列出。
也就是说,在 Show 中的某处应该有一个有序数组(或哈希或任何东西)可以包含 Song1、Song2、Song1、Song3 并允许从该数组重新排序、插入或删除。
我无法弄清楚如何使用 ActiveRecord 关联对其进行建模。我猜我需要某种带有索引列的特殊连接表,但是除了开始直接编写我的 SQL 之外,有没有办法用 Rails 关联来做到这一点?
我现在拥有的一些代码(但不能正常工作):
class Song < ActiveRecord::Base
attr_accessible :title
has_and_belongs_to_many :shows
end
class Show < ActiveRecord::Base
attr_accessible :date
has_and_belongs_to_many :songs
end
song1 = Song.create(title: 'Foo')
song2 = Song.create(title: 'Bar')
show1 = Show.create(date: 'Tomorrow')
show1.songs << song1 << song2 << song1
puts "show1 size = #{show1.songs.size}" # 3
show1.delete_at(0) # Should delete the first instance of song1, but leave the second instance
puts "show1 size = #{show1.songs.size}" # 2
show1.reload
puts "show1 size = #{show1.songs.size}" # 3 again, annoyingly
插入可能如下所示:
show1.songs # Foo, Bar, Foo
song3 = Song.create(title: 'Baz')
show1.insert(1, song3)
show1.songs # Foo, Baz, Bar, Foo
重新排序可能(有点神奇)看起来像:
show1.songs # Foo, Bar, Foo
show1.move_song_from(0, to: 1)
show1.songs # Bar, Foo, Foo