Rails 5:迭代多态模型并找到顶级父级的最佳方法?

时间:2016-11-17 23:34:06

标签: ruby-on-rails ruby postgresql activerecord ruby-on-rails-5

编辑:为了尽可能保持透明并为将来的人们提供一个有效的解决方案,我想解释一下我如何在我的问题中使用@John Hayes-Reed的答案。我将更新下面的方法和模型。

更新方法:

#User.rb
def self.find_all_user_comments(user)
  @comment_hash = []
  @user_comments = Comment.where(user_id: user.id)
  @user_comments.all.each do |co|
     post = co.find_parent_post
    @comment_hash.push( { comment: co, post: post} )
  end
  @comment_hash
end

我从下面的答案得到的新方法:

#comment.rb
def find_parent_post
  return self.commentable if self.commentable.is_a?(Post)
  self.commentable.find_parent_post
end

我调用方法的控制器:

#users_controller.rb
def control_panel
  @comments = User.find_all_user_comments(current_user)
end

结束编辑

我正在尝试在其控制面板中为用户实施“最新评论”。评论可以留在Post或其他comment

在我看来,我希望显示:body的{​​{1}}以及通过哈希创建的comment。这也适用于post s comment。幸运的是,评论只能像这样深入两个

comment

我有一个方法,我将在下面输入,该方法适用于留在帖子上的Post Comment Child Comment # Would like to find the parent post. Child Comment Comment ,但在尝试查找comment时有comment会中断}。

我唯一的解决方案是使用commentable_type: "Comment"语句说if,找到 评论父母,抓住帖子,然后点击帖子`然后把它带回来直到那个孩子评论并将其推入哈希那样。

我想知道是否有一种更有效的方式(AR或SQL)来做这样的事情,最后,我发现if commentable_type == "Comment"的父comment是偶数的如果它是Post的{​​{1}}。

以下是我认为有用的所有信息:

架构:

comment

模特:

comment

现在的方法。找不到create_table "comments", force: :cascade do |t| t.text "body" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "commentable_id" t.string "commentable_type" t.integer "user_id" end create_table "forums", force: :cascade do |t| t.string "name" t.text "description" t.integer "user_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["user_id"], name: "index_forums_on_user_id", using: :btree end create_table "posts", force: :cascade do |t| t.string "title" t.text "description" t.integer "user_id" t.integer "forum_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["forum_id"], name: "index_posts_on_forum_id", using: :btree t.index ["user_id"], name: "index_posts_on_user_id", using: :btree end ...User table omitted for brevity... 的评论时不会工作:

#post model
belongs_to :user
belongs_to :forum

has_many :comments, as: :commentable

#comment model
belongs_to :user
belongs_to :commentable, polymorphic: true
has_many :comments, as: :commentable

查看:

commentable_type: "Comment"

2 个答案:

答案 0 :(得分:2)

你可以在你的注释类中添加一个方法,并使用一些递归来完成工作(在技术上不是真正的递归,因为它在第二个实例上调用方法,但我们可以使用类似的概念),沿着这条线:

def find_parent_post
    return self.commentable if self.commentable.is_a?(Post)
    self.commentable.find_parent_post
end

如果您想要更深入地嵌套评论,这也是未来的证据。

答案 1 :(得分:1)

可能找到帖子的一个班轮可能是:

post = (comment.commentable.is_a? Post) ? comment.commentable : comment.commentable.commentable