编辑:为了尽可能保持透明并为将来的人们提供一个有效的解决方案,我想解释一下我如何在我的问题中使用@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"
答案 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