我想做一个应用程序,但我仍然坚持如何设计模型。到目前为止,我有这些模型:User
,Post
,Tag
,Like
,Comment
。我为每个人创建了一个模型,控制器,视图和迁移文件。到目前为止一直很好,但现在我的问题是我应该只是做它们之间的关系还是创建这些模型:PostTag
,PostLike
,PostComment
。你知道,他们只会有这些关系,所以当有人删除帖子中的标签时,他实际上只是删除了关系,而不是标签本身,因为标签可能用在另一个帖子中。
答案 0 :(得分:0)
您只需要添加Tagging
模型,并使用多态关联来处理Likes
。因此,您需要User
,Post
,Comment
,Like
,Tag
和Tagging
您不需要标签或标签或喜欢的控制器
如果您希望users
能够创建posts
和comments
以及like
posts
和comments
,那么是配置模型的一种方法:
用户模型:
class User < ActiveRecord::Base
has_many :posts
has_many :comments
has_many :likes, as: :likeable, dependent: :destroy
end
发布模型:
class Post < ActiveRecord::Base
belongs_to :user
has_many :comments
has_many :likes, as: :likeable, dependent: :destroy
has_many :taggings
has_many :tags, through: :taggings
def self.tagged_with(name)
Tag.find_by_name!(name).posts
end
def self.tag_counts
Tag.select("tags.*, count(taggings.tag_id) as count").
joins(:taggings).group("taggings.tag_id")
end
def tag_list
tags.map(&:name).join(", ")
end
def tag_list=(names)
self.tags = names.split(",").map do |n|
Tag.where(name: n.strip).first_or_create!
end
end
end
评论模型:
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
喜欢模特:
class Like < ActiveRecord::Base
belongs_to :likeable, polymorphic: true
end
标记迁移生成器:
rails g model tag name
标记模型:
class Tag < ActiveRecord::Base
has_many :taggings
has_many :posts, through: :taggings
end
标记迁移生成器:
rails g model tagging tag:belongs_to post:belongs_to
标记模型
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :post
end
Post模型假设您的标记使用属性:name
要访问已标记的帖子,请添加此路线
get 'tags/:tag', to: 'posts#index', as: :tag
并将Posts控制器中的索引操作更改为:
def index
if params[:tag]
@posts = Post.tagged_with(params[:tag])
else
@posts = Post.all
end
end
最后,添加一个指向Post Show视图的链接,如下所示:
<%= raw @post.tags.map(&:name).map { |t| link_to t, tag_path(t) }.join(', ') %>