Rails多对多关系和远程关系

时间:2012-02-08 00:37:06

标签: ruby-on-rails activerecord

假设我们在rails中有专辑,艺术家和歌曲模型。

在专辑中:

class Album < ActiveRecord::Base
  has_many :artist_album
  has_many :artist, :through => :artist_album
  has_many :song

在artistalbum中:

class ArtistAlbum < ActiveRecord::Base
  belongs_to :album
  belongs_to :artist
end

歌曲中:

class Song < ActiveRecord::Base
  has_many :artist_song
  has_many :artists, :through => :artist_song
  belongs_to :album

艺术家:

class Artist < ActiveRecord::Base
  has_many :artist_song
  has_many :song, :through => :artist_song

是否可以使用活动记录选择以下记录集:

  • 查找属于艺术家的相册

由于艺术家与歌曲相关,而专辑只是一组歌曲,而且艺术家与专辑没有直接关系。

同样选择每首歌曲属于相关艺术家的每张专辑

本质上就是这个效果:

SELECT albums.`name`
FROM artists INNER JOIN artist_songs ON artists.id = artist_songs.artist_id
     INNER JOIN songs ON songs.id = artist_songs.song_id
     INNER JOIN albums ON songs.album_id = albums.id

1 个答案:

答案 0 :(得分:0)

您是否错过了ArtistSong型号?通常我们在has_many中使用复数形式,即has_many :artist_songs

如果您拥有ArtistAlbum加入模式,则无需转到Song部分...如果您进行了以下设置,则只需artist.albums

class Artist < ActiveRecord::Base
  has_many :artist_albums
  has_many :albums, :through => :artist_albums
end

以下是您可以使用的内容,但不一定是必需的。

class ArtistAlbum < ActiveRecord::Base
  belongs_to :artist
  belongs_to :album
end

class Album < ActiveRecord::Base
  has_many :artist_albums
  has_many :artist, :through => :artist_albums
end