我正在使用Ruby on Rails播客捕手,我无法弄清楚如何为每个用户的剧集状态建模。
我希望有一个模型,其中包含有关剧集的信息,以及用户是否播放了剧集或者他们对其进行了评分。
表格如下所示:
episodes_1
id | user_id | podcast_id | title | audio_url | duration| is_played | rating
如果许多用户订阅了相同的播客,则会有许多相同的播客 title和audio_url,所以我想到了另一个表格表示:
episodes_2
id | podcast_id | title | audio_url | duration
user_episode_data
id | user_id | episode_id | is_played | rating
如果您在user_episode_data
加入了episodes_2
user_episode_data.episode_id = episode_2.id
,那么您将获得一张包含episodes_1
第二种选择似乎是存储数据的更好方法,但第一种选择似乎是一种更好的方式来呈现数据。
是否可以使用多个表来存储模型?
class Podcast < AcitiveRecord::Base
has_many :episodes
end
class Episode < ActiveRecord::Base
belongs_to :podcast
has_many :user_episode_datas
end
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :podcast
end
class User < ActiveRecord::Base
has_may :subscriptions
has_may :podcasts, through: :subscriptions
has_may :episodes, through :podcasts
has_many :user_episode_datas
end
class UserEpisodeData < ActiveRecord::Base
belongs_to :user
belongs_to :episode
end
我希望user.episodes
返回他们订阅的每个播客的所有剧集集合,如果该用户播放了该剧集,我希望user.episodes.first.is_played
返回true剧集,但剧集模型并不属于任何用户,所以我不知道如何在剧集中的剧集和user_episode_data之间建立一对一的关系
答案 0 :(得分:2)
没有必要以提议的方式建立这些关系。相反,将Episode
和User
建模为has_many :through
关系:
class User < ActiveRecord::Base
has_many :views
has_many :episodes, through: :views
end
class View < ActiveRecord::Base
belongs_to :user
belongs_to :episode
end
class Episode < ActiveRecord::Base
has_many :views
has_many :users, through: :views
end
规范Rails指南provides an explanation的示例非常接近您所描述的场景。以下是关于has_many :through
关系的内容:
has_many:通过关联通常用于与另一个模型建立多对多连接。此关联表示通过第三个模型可以将声明模型与另一个模型的零个或多个实例匹配。
请注意,在上面的示例中,View
模型有效地充当了连接表。如果要为Episode
和User
- has_played
或rating
之间的关系添加属性,您可以将这些属性添加到{{1} } model。