Rails模型:如何做关系

时间:2016-12-05 15:19:11

标签: ruby-on-rails

我想做一个应用程序,但我仍然坚持如何设计模型。到目前为止,我有这些模型:UserPostTagLikeComment。我为每个人创建了一个模型,控制器,视图和迁移文件。到目前为止一直很好,但现在我的问题是我应该只是做它们之间的关系还是创建这些模型:PostTagPostLikePostComment。你知道,他们只会有这些关系,所以当有人删除帖子中的标签时,他实际上只是删除了关系,而不是标签本身,因为标签可能用在另一个帖子中。

1 个答案:

答案 0 :(得分:0)

您只需要添加Tagging模型,并使用多态关联来处理Likes。因此,您需要UserPostCommentLikeTagTagging

您不需要标签或标签或喜欢的控制器

如果您希望users能够创建postscomments以及like postscomments,那么是配置模型的一种方法:

用户模型:

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(', ') %>