首先,为英语感到抱歉
所以我已经有了“用户-帖子”一对多的关联,这意味着每个帖子只能有一个作者,现在我想在用户配置文件中添加“最喜欢的帖子”按钮,在每个帖子中添加“添加到最喜欢的”按钮,那么问题是如何实现这种正确的方式?我应该重新设计我的用户帖子协会吗?或者创造另一个模型?我有点糊涂。提前感谢!
,实际上,我想要这个结果:
@user.posts #返回此用户创建的所有帖子
@user.favorite_posts #返回此用户添加到收藏夹中的帖子
这是我的用户模型:
class User < ApplicationRecord
mount_uploader :avatar, ImageUploader
validates :username, presence: true, uniqueness: true, length: {in: 3..20}
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :posts, dependent: :destroy
has_many :comments, dependent: :destroy
has_many :ratings
enum role: [ :user, :admin ]
def calculate_average
ratings.blank? ? 0 : ratings.map(&:value).inject(:+) / ratings.count.to_f
end
end职位模式:
class Post < ApplicationRecord
mount_uploader :image, ImageUploader
validates :body, presence: true
validates :title, presence: true, length: { maximum: 50}
belongs_to :user
has_many :comments, dependent: :destroy
end编辑
好吧,看看我是怎么做到的,它的工作方式和我想要的完全一样。
这里是我的用户模型:
class User < ApplicationRecord
mount_uploader :avatar, ImageUploader
validates :username, presence: true, uniqueness: true, length: {in: 3..20}
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :posts, dependent: :destroy
has_many :comments, dependent: :destroy
has_many :ratings
has_many :favorites, dependent: :destroy
has_many :favorite_posts, through: :favorites, source: "post"
enum role: [ :user, :admin ]
def calculate_average
ratings.blank? ? 0 : ratings.map(&:value).inject(:+) / ratings.count.to_f
end
end发布于 2018-03-15 12:52:38
为“UserFavoritePost”存储的post_id和user_id创建一个新模型。并为favorite_posts创建自定义关联。
class UserFavoritePost < ApplicationRecord
belongs_to :post
belongs_to :user
end
class User < ApplicationRecord
has_many :posts, dependent: :destroy
has_many :user_favorite_posts
has_many :favorite_posts, throught: :user_favorite_posts, class: 'Post'
end发布于 2018-03-16 16:47:08
傻瓜-dev的答案不提供对最喜欢的帖子的直接访问,因此索引视图需要一个循环。普拉萨纳的方法解决了这个问题,但他的回答被不公平地指责为不完整和剽窃。以下是完整的方法:
您需要一个多到多个关系,这是事实,所以您需要一个连接模型和表。但是这个模型是辅助的。不应该有任何重要的逻辑,我不认为它应该有一个控制器或观点。
class User < ApplicationRecord
has_many :posts, dependent: :destroy # Posts created by this user
has_many :favs, dependent: :destroy
has_many :fav_posts, through: :favs # Favorite posts for this user
end
class Post < ApplicationRecord
belongs_to :user
has_many :favs, dependent: :destroy
has_many :fav_users, through: :favs # Users who have this post as favorite
end
class Fav < ApplicationRecord
belongs_to :user
belongs_to :post
end这允许使用用户类中的两种不同方法访问用户创建的所有帖子和他喜欢的所有帖子。
@posts = current_user.posts # Posts created by this user
@fav_posts = current_user.fav_posts # Favorite posts 认为:
<h1><% current_user.name %></h1>
<h2>Your posts</h2>
<%= render @posts %>
<h2>Your favorite posts from other users</h2>
<%= render @fav_posts %>您不需要一个控制器来创建、查看或删除喜爱的帖子。只需在用户或Post控制器中处理此逻辑即可。例如,对于最喜欢或不喜欢的帖子,只需在PostsController中添加fav和unfav方法即可。
def fav
current_user.fav_posts << Post.find(params[:id])
end
def unfav
current_user.favs_posts.destroy(Post.find(params[:id]))
end认为:
<%= link_to "Favorite", fav_post_path(id: post.id) %>
<%= link_to "Unfavorite", unfav_post_path(id: post.id) %>您应该在路由中添加以下方法:
post '/posts/:id/fav', to: 'posts#fav', as: 'fav_post'
post '/posts/:id/unfav', to: 'posts#unfav', as: 'unfav_post'https://stackoverflow.com/questions/49299411
复制相似问题