如何在Ruby on Rails应用程序中为每个用户状态建模

时间:2014-01-05 04:33:48

标签: ruby-on-rails

我正在使用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之间建立一对一的关系

1 个答案:

答案 0 :(得分:2)

没有必要以提议的方式建立这些关系。相反,将EpisodeUser建模为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模型有效地充当了连接表。如果要为EpisodeUser - has_playedrating之间的关系添加属性,您可以将这些属性添加到{{1} } model。