为每个用户创建一个独特的模型?

时间:2013-06-13 23:28:11

标签: ruby ruby-on-rails-3

这可能很容易,但我不知道它的用语...

我在创建的网站上有一个用户模型,可以显示视频。

用户可以将视频标记为“已观看”。它的默认状态为false。

我想这样做,如果用户A将视频标记为“已观看”(使值为“真”),那么当用户B查看视频时,它会显示为false。

即。每个视频对每个用户都是“唯一的”。

谢谢!

1 个答案:

答案 0 :(得分:1)

您应该创建另一个模型,以便存储谁分别观看了哪个视频。

例如,您已经创建了UserVideo。您需要创建另一个模型,以便某些用户存储观看的视频。例如,我们将其命名为WatchedVideo。它将以user_idvideo_id作为其属性。

更新您的模型以设置has_many through关联。

class User < ActiveRecord::Base
  has_many :videos, through: :watched_videos
end

class Video < ActiveRecord::Base
  has_many :users, through: :watched_videos
end

class WatchedVideo < ActiveRecord::Base
  belongs_to :user
  belongs_to :video
end

因此,下次用户观看视频时,只需在WatchedVideo中添加记录即可。例子:

# Create the viewing record
# Create a controller and define an action that will do something like this
# POST using AJAX or whatever method suitable for you
w = User.find(1).watched_videos.build
# w = current_user.watched_videos.build
w.video_id = params[:video_id]
w.save

# Check if the user has watched the video 
# so that you can set wheter the User A/B has viewed it or not
WatchedVideo.where(user_id: 1, video_id: 2)
User.find(1).watched_videos.where(2)

因此,如果这些命令中的任何一个返回的值不是nil,则特定用户(id = 1)已经观看了该视频。

您还需要进行唯一验证,以便用户无法标记超过1次。

class User < ActiveRecord::Base
  belongs_to :user
  belongs_to :video

  validates :video_id, uniqueness: { scope: :user_id }
end

参考: