gpt4 book ai didi

ruby-on-rails - 何时向 user_posts 表添加记录以跟踪 'likes'

转载 作者:搜寻专家 更新时间:2023-10-30 20:27:31 24 4
gpt4 key购买 nike

我有一个 has_many 主题的群组模型。主题模型 has_many 帖子,我的用户模型只阅读帖子等。我还有一个 users_posts 模型,用于跟踪用户是否已阅读帖子以及他们是否“喜欢”该帖子,它有 :group_id、:user_id 和 :read 和 :liked bool 字段。用户创建一个组并在不同主题下添加帖子。

群组显示操作是;@posts = Group.topics.includes(:posts)

我的问题是何时以及如何向 users_posts 表添加记录?应该是第一次创建帖子时吗?还是仅当用户第一次查看帖子时?

将 user_posts 中的属性添加到@posts 中的每条记录的最佳方法是什么?在我使用虚拟属性的那一刻,这是正确的方法吗?

class Post < ActiveRecord::Base
belongs_to :topic
has_many :users, through: :user_entries
attr_accessor :read, :liked

最佳答案

身份证

首先,您不需要在user_posts 模型/表中使用:group_id

Rails 和关系数据库使用主键 为元素提供唯一的 ID。这意味着无论 post 是否是 group 的成员,您仍然会使用 post_id foreign key 引用它-

#users_posts
id | user_id | post_id | read | updated | created_at | updated_at

--

属性

add the attributes from user_posts to each record in @posts

这样做的方法是将 user_postsUserPost 模型相关联 -

#app/models/user.rb
Class User < ActiveRecord::Base
has_many :user_posts
has_many :posts, through: :user_posts
end

#app/models/post.rb
Class Post < ActiveRecord::Base
has_many :user_posts
has_many :users, through: :user_posts
end

这将允许您调用 @user.posts

如果您想为每个post 关联对象附加额外的属性,您需要使用ALIAS SQL join。 ,或 ActiveRecord Association Extension :

#app/models/post.rb
Class User < ActiveRecord::Base
has_many :user_posts
has_many :posts, through: :user_posts, extend: PostUser
end

#app/models/concerns/post_user.rb
module PostUser

#Load
def load
reads.each do |caption|
proxy_association.target << read
end
end

#Private
private

#Attributes
def captions
return_array = []
through_collection.each_with_index do |through,i|
associate = through.send(reflection_name)
associate.assign_attributes({read: items[i]}) if items[i].present?
return_array.concat Array.new(1).fill( associate )
end
return_array
end

#######################
# Variables #
#######################

#Association
def reflection_name
proxy_association.source_reflection.name
end

#Foreign Key
def through_source_key
proxy_association.reflection.source_reflection.foreign_key
end

#Primary Key
def through_primary_key
proxy_association.reflection.through_reflection.active_record_primary_key
end

#Through Name
def through_name
proxy_association.reflection.through_reflection.name
end

#Through
def through_collection
proxy_association.owner.send through_name
end

#Captions
def items
through_collection.map(&:read)
end

#Target
def target_collection
#load_target
proxy_association.target
end

end

--

系统

底线是我认为您的系统最好这样运行:

1. Set up a semi-persistent data store to track user / post reads (REDIS)
2. Every time you call a `Post`, you'll be able to call the associated `REDIS` references for it

这将使您能够创建一个首先是模块化的系统,但您也可以创建一个实例方法来确定用户是否已阅读帖子,如下所示:

#app/models/post.rb
Class Post < ActiveRecord::Base
def read?
##Redis lookup for user with post - if "read" attribute is true, return true
end

def liked?
##Redis lookup for user with post - if "liked" attribute is true, return true
end
end

这将允许您运行 @user.posts.first.read?

关于ruby-on-rails - 何时向 user_posts 表添加记录以跟踪 'likes',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24447999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com