Rails:多态关联,查找评论
Rails: polymorphic associations, find commented on
我已经使用 this tutorial 在我的 Rails 应用程序上实现了多态评论。
所以我有:
class Place < ApplicationRecord
has_many :comments, as: :commentable
end
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
现在我想为所有评论建立索引,并将它们与他们评论的地方结合起来,但我不知道如何实现这一点。
在我的 comments_controller.rb
我有:
class CommentsController < ApplicationController
def index
@comments = Comment.all
end
end
在我的评论中 index.html.erb
我可以访问:
<%= comment.commentable_type %>
<%= comment.commentable_id %>
但是我如何访问评论所在的实际属性,例如:<%= comment.place.name %>
?
我相信它与这个答案有关,但我不知道如何:rails joins polymorphic association
mccalljt 上面的回答好多了
相信我明白了:
添加到 comment.rb
:
belongs_to :place, foreign_key: 'commentable_id'
添加到 comments_controller.rb
:
@comments = Comment.where(commentable_type: "Place").joins(:place)
虽然关联多了就不能复用了,不过我可以改成:
@place_comments = Comment.where(commentable_type: "Place").joins(:place)
@other_comments = Comment.where(commentable_type: "Other").joins(:other)
您可以通过
引用评论对象
comment.commentable
这里唯一要注意的是,它假定您所有的评论都有您调用它们的方法,例如 name
。
comment.commentable.name
您需要在您的控制器中预加载这些以避免 N+1。
class CommentsController < ApplicationController
def index
@comments = Comment.includes(:commentable).all
end
end
我已经使用 this tutorial 在我的 Rails 应用程序上实现了多态评论。
所以我有:
class Place < ApplicationRecord
has_many :comments, as: :commentable
end
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
现在我想为所有评论建立索引,并将它们与他们评论的地方结合起来,但我不知道如何实现这一点。
在我的 comments_controller.rb
我有:
class CommentsController < ApplicationController
def index
@comments = Comment.all
end
end
在我的评论中 index.html.erb
我可以访问:
<%= comment.commentable_type %>
<%= comment.commentable_id %>
但是我如何访问评论所在的实际属性,例如:<%= comment.place.name %>
?
我相信它与这个答案有关,但我不知道如何:rails joins polymorphic association
mccalljt 上面的回答好多了
相信我明白了:
添加到 comment.rb
:
belongs_to :place, foreign_key: 'commentable_id'
添加到 comments_controller.rb
:
@comments = Comment.where(commentable_type: "Place").joins(:place)
虽然关联多了就不能复用了,不过我可以改成:
@place_comments = Comment.where(commentable_type: "Place").joins(:place)
@other_comments = Comment.where(commentable_type: "Other").joins(:other)
您可以通过
引用评论对象comment.commentable
这里唯一要注意的是,它假定您所有的评论都有您调用它们的方法,例如 name
。
comment.commentable.name
您需要在您的控制器中预加载这些以避免 N+1。
class CommentsController < ApplicationController
def index
@comments = Comment.includes(:commentable).all
end
end