同一型号的has_many和belongs_to

pre*_*yce 1 ruby activerecord ruby-on-rails

我对rails非常陌生.我试图找出在两个模型之间创建关系的最有效方法:

  1. 用户可以"喜欢"许多歌曲
  2. 一首歌有一个主人.

这就是我在想的事情.是否有意义 ?

class User < ActiveRecord::Base
    has_many :songs #songs this user has favorited
end

class Song < ActiveRecord::Base
    belongs_to :user #the user whom submitted this song
end
Run Code Online (Sandbox Code Playgroud)

我对这种方法的关注是,我不确定对数据库中每首歌进行查询的效率,只是为了弄清楚特定用户拥有哪些歌曲.有没有不同的方式我应该考虑这个?

顺便说一下,有没有一种方法可以调用属性,而不是它的模型名称.因此,即使模型仍然是"歌曲",User.find(1).songs[0]我也不能说User.find(1).favorites[0].

Pin*_*nyM 7

用户和乐曲模型之间需要2个独立的关系.也就是说,您需要一个"所有者"关系和一个"最喜欢"的关系."所有者"关系可以是一个简单的has_many/belongs_to,就像现在一样.在"最喜欢"的关系是多到多,将需要使用,也可以作为一个连接表habtm的表或与第一类模型has_many through作为解释的关系在这里.

一般推荐的方法是使用has_many through它,因为它可以让你更好地控制:

class User
  has_many :songs                                            # these are songs 'owned' by the user
  has_many :user_favorite_songs
  has_many :favorite_songs, :through => :user_favorite_songs # these are the favorites
end

class Song
  belongs_to :user
  has_many :user_favorite_songs
end

class UserFavoriteSong
  belongs_to :user
  belongs_to :favorite_song, :class_name => 'Song', :foreign_key => :song_id
end
Run Code Online (Sandbox Code Playgroud)