Ruby on rails 如果我们需要跟踪用户,如何构建用户和帖子之间的关联';与员额的互动

Ruby on rails 如果我们需要跟踪用户,如何构建用户和帖子之间的关联';与员额的互动,ruby-on-rails,database,Ruby On Rails,Database,我有一个应用程序,它只显示人们以前没有看到过的帖子,所以每次用户打开一篇文章时,我需要为这个用户/帖子组合将seen_标志设置为true 将其设置为与存储该交互的联接表的M:M关系是正确的方法吗?还是应该仍然是1:M 编辑 下面是我在用户和文章之间的关联。一个用户可以创建一篇文章,但许多用户可以查看一篇文章,并且文章有许多已查看的用户,因此我需要一个通过拥有多个用户和属于关联 class Article < ActiveRecord::Base belongs_to :user h

我有一个应用程序,它只显示人们以前没有看到过的帖子,所以每次用户打开一篇文章时,我需要为这个用户/帖子组合将seen_标志设置为true

将其设置为与存储该交互的联接表的M:M关系是正确的方法吗?还是应该仍然是1:M

编辑

下面是我在用户和文章之间的关联。一个用户可以创建一篇文章,但许多用户可以查看一篇文章,并且文章有许多已查看的用户,因此我需要一个
通过
拥有多个用户和
属于
关联

class Article < ActiveRecord::Base
  belongs_to :user
  has_many :viewed_users, through: :article_view_histories
  has_many :article_view_histories
end

class User < ActiveRecord::Base
  has_many :articles
  has_many :viewed_articles, through: :article_view_histories
  has_many :article_view_histories
end

class ArticleViewHistory < ActiveRecord::Base
  belongs_to :viewed_users, :class_name => "User", :foreign_key => :user_id
  belongs_to :viewed_articles, :class_name => "Article", :foreign_key => :article_id
end
类文章“用户”,:外部密钥=>:用户id
属于:已查看的文章,:class\u name=>“Article”,:foreign\u key=>:Article\u id
结束

您还可以创建另一个名为viewings的表,其中包含用户id、post id和viewed标志。

我会使用
has\u many:to
,尽管这在数据库中会很昂贵


更好的方法是为
帖子
A
用户
查看过的帖子存储
键:值
对。有一个

我会在
帖子#show
动作中这样做:

#app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def show
     # considering you're using Devise "current_user"
     @post = Post.find params[:id]
     $redis.sadd(current_user.id, @post.id) #-> this will need to change
  end
end
#app/controllers/posts_controller.rb
类PostsController<应用程序控制器
def秀
#考虑到您正在使用Desive“当前用户”
@post=post.find参数[:id]
$redis.sadd(current_user.id,@post.id)#->这需要更改
结束
结束
这将允许您在帖子模型中添加一个类方法,以获取用户尚未查看的相关帖子:

#app/models/user.rb
class Post < ActiveRecord::Base
   def self.viewed(user, viewed=true)
      posts = $redis.get(user.id) #-> this will need to change
      where = "not" unless viewed is true
      self.where("`id` #{where} IN ?", posts)
   end
end
#app/models/user.rb
类Post这需要更改
where=“not”除非是true
self.where(“'id`{where}IN?”,posts)
结束
结束
--

现在,Redis是一个临时(半持久)数据存储。这意味着您不应该依赖它来获得长期解决方案。相反,您可能希望将redis数据“转储”到一个datatable中,或者如果您愿意让它丢失,那么将其永久保存在redis中


我可以根据您的要求提供更多信息。

这是一个多对多关系,因此如果您想要一个标准化的数据库,应该使用连接表进行拆分。它确实是一个m:m关系,但要注意这将生成的行数。您还必须创建有效的查询来检索未读邮件。也许像宝石一样的东西会被使用(免责声明:我自己从未使用过)。谢谢。我已经更新了我的初始帖子,以反映我对多人方法的实现,以及对文章创建者关系的一人多实现。你介意看一下吗?嗨,里奇,谢谢。所谓“昂贵”,您的意思是连接表会很大,而查询速度可能很低吗?Redis看起来不错,但由于我刚刚开始编写我的第一个生产应用程序,我想我会坚持db级别,稍后再合并Redis。你认为这是一个很好的方法,还是Redis是你从一开始就必须设计的东西?从db的角度来说,昂贵只是意味着积累数据需要更多的时间/资源。如果您对此不太在意,您可以使用
many-to-many
方法,而不会出现任何问题!谢谢我已经更新了我的初始帖子,以反映我对多人方法的实现,以及对文章创建者关系的一人多实现。你介意看一下吗?