Ruby on rails [rails]:在数据库上实现多个索引

Ruby on rails [rails]:在数据库上实现多个索引,ruby-on-rails,ruby,sqlite,Ruby On Rails,Ruby,Sqlite,我正在Rails 6.1.1中设计一个音乐数据库(SQLite v3),其规格如下: 每首歌只能属于一张专辑,而这张专辑又只能属于一位艺术家 每首歌曲可以属于多个播放列表,而每个播放列表可以有多首歌曲 我能在相应的专辑或播放列表中记录歌曲位置的最佳方法是什么?例如,我应该能够知道“这首歌是X专辑的第二首歌,Y播放列表的第27首歌,Z播放列表的第13首歌” 我在脑海中构思的两种方法如下: 在歌曲表中维护一个album\u index列。这很容易实现,因为一首歌只属于一张专辑 在歌曲表中

我正在Rails 6.1.1中设计一个音乐数据库(SQLite v3),其规格如下:

  • 每首歌只能属于一张专辑,而这张专辑又只能属于一位艺术家

  • 每首歌曲可以属于多个播放列表,而每个播放列表可以有多首歌曲

我能在相应的专辑或播放列表中记录歌曲位置的最佳方法是什么?例如,我应该能够知道“这首歌是X专辑的第二首歌,Y播放列表的第27首歌,Z播放列表的第13首歌”

我在脑海中构思的两种方法如下:

  • 在歌曲表中维护一个
    album\u index
    列。这很容易实现,因为一首歌只属于一张专辑

  • 在歌曲表中维护多个
    playlist{playlist\u ID}\u索引
    列。这似乎很困难。我能想到的唯一实现方法是在每次创建或删除播放列表记录时使用活动记录回调


有没有更好的方法来实现这一点?

播放列表表遇到的主要问题是歌曲和播放列表表之间的多对关系。要解决此问题,您可以创建一个中间表,其中最多包含三列:歌曲id、播放列表id,最后是位置。然后,键将是歌曲和播放列表id的组合,以确保唯一性,并包括歌曲在每个播放列表中的位置。

播放列表表遇到的主要问题是歌曲和播放列表表之间的多对关系。要解决此问题,您可以创建一个中间表,其中最多包含三列:歌曲id、播放列表id,最后是位置。然后,关键是歌曲和播放列表id的组合,以确保唯一性,并包括歌曲在每个播放列表中的位置。

这实际上只是一个普通的多对多关系。您需要一个单独的联接表来链接
歌曲
播放列表
中的行。由于您希望实际存储其他数据(位置),因此您需要一个模型

您可以使用以下工具生成模型:

rails g model PlaylistItem song:belongs_to playlist:belongs_to position:integer
随便你想叫什么名字都行

然后,您可以通过间接关联链接歌曲和播放列表:

class Song < ApplicationRecord
  has_many :playlist_items
  has_many :playlists, through: :playlist_items
end

# columns:
# - song_id [Bigint] foreign key
# - playlist_id [Bigint] foreign key
# - position [Int]
class PlaylistItem < ApplicationRecord
  belongs_to :song
  belongs_to :playlist
end

class Playlist < ApplicationRecord
  has_many :playlist_items
  has_many :songs, through: :playlist_items
end
classsong
这实际上只是一种普通的多对多关系。您需要一个单独的联接表来链接
歌曲
播放列表
中的行。由于您希望实际存储其他数据(位置),因此您需要一个模型

您可以使用以下工具生成模型:

rails g model PlaylistItem song:belongs_to playlist:belongs_to position:integer
随便你想叫什么名字都行

然后,您可以通过间接关联链接歌曲和播放列表:

class Song < ApplicationRecord
  has_many :playlist_items
  has_many :playlists, through: :playlist_items
end

# columns:
# - song_id [Bigint] foreign key
# - playlist_id [Bigint] foreign key
# - position [Int]
class PlaylistItem < ApplicationRecord
  belongs_to :song
  belongs_to :playlist
end

class Playlist < ApplicationRecord
  has_many :playlist_items
  has_many :songs, through: :playlist_items
end
classsong
非常感谢!非常感谢你!使用带有播放列表id、
歌曲id
和索引的中间型号/表格。可能是播放项目。通过@Stefan连接歌曲和播放列表我将避免调用列
索引
,因为这在SQL中是一个保留字。使用中间模型/表,其中包含
播放列表id
歌曲id
,以及
索引
。可能是播放项目。通过@Stefan连接歌曲和播放列表我会避免调用列
index
,因为这是SQL中的保留字。我犯了一个小错误。它应该是
position:integer
而不是
position:int
。我犯了一个小错误。它应该是
position:integer
,而不是
position:int