Ruby on rails RubyonRails获得所有评论

Ruby on rails RubyonRails获得所有评论,ruby-on-rails,ruby,activerecord,many-to-many,polymorphic-associations,Ruby On Rails,Ruby,Activerecord,Many To Many,Polymorphic Associations,我有一个(多态)对象注释(将用于车辆和查看对象)。如何获取用户车辆的所有注释:@User.vehicles.comments?它表示,ActiveRecord::Relation的方法comments未定义。有什么简单的方法让它工作吗?是否存在多对多关系:许多车辆都有许多评论?还是我错了@user.vehicles.first.comments工作正常 对象之间的关系(不完整): 我认为你正在尝试做复杂的关联,或者你可能误解了多态关联。这比你想象的要简单。以下是您应该定义的关联: User h

我有一个(多态)对象
注释
(将用于
车辆
查看
对象)。如何获取
用户
车辆
的所有
注释
@User.vehicles.comments
?它表示,
ActiveRecord::Relation
的方法
comments
未定义。有什么简单的方法让它工作吗?是否存在多对多关系:许多车辆都有许多评论?还是我错了<代码>@user.vehicles.first.comments
工作正常

对象之间的关系(不完整):


我认为你正在尝试做复杂的关联,或者你可能误解了多态关联。这比你想象的要简单。以下是您应该定义的关联:

User 
has_many vehicles 

Vehicle 
belongs_to user 
has_many comments, as: :commentable

Comment 
belongs_to :commentable, polymorphic: true
要获取用户对车辆的所有评论,您可以在用户模型中定义一个
has\u many:through
关联:

User 
has_many vehicles 
has_many comments, through: :vehicles
现在,您可以使用
@user.comments
获取有关用户车辆的所有评论。

尝试以下方法:

在用户模型中添加:

has_many :comments, :through => :vehicles
为车辆和评论编辑:

在用户模型中:

has_many :comments, :through => :vehicles, :as => :comments_vehicles
has_many :comments, :through => :reviews, :as => :comments_reviews

def comments
  self.comments_vehicles + self.comments_reviews
end

评论部分很好。问题是——你在打电话:

@user.vehicles.comments
这里,车辆是一个AR关系对象,它不知道任何有关注释的信息。ie-@user.vehicles是该用户的车辆集合

要获取有关链接到用户的车辆的所有评论,您可以执行以下操作:

@user.vehicles.to_a.collect{|v| v.comments.to_a }.flatten
它将返回用户车辆上所有评论的数组。

尝试以下操作:

在user.rb中写入以下内容:

    has_many :comments, :through => :vehicles
现在做

 @user.comments  
它将获取为您的车辆创建的所有注释

您还可以通过以下方式获取评论:

    @user.vehicles(:include => :comments).collect{|v| v.comments}.flatten


但在我看来,这不是正确的方法。

请您添加有关用户、车辆、注释之间关系的型号代码。用户有很多车辆。车辆属于用户。车辆有许多注释(可注释)。评论属于可评论的:多态=>true。请编辑您的问题以添加此内容,它将比评论中的内容更具可读性。我认为如果您使用user.vehicles,您将无法获得车辆。你得到的是所有的车辆,当然不是。我想获得属于用户的所有车辆的所有评论。那么评论和其他事情的评论呢?你可以使用返回self.comments\u vehicle+self.comments\u评论的方法,但我不确定这是否是最佳解决方案。你能更新你的代码并展示如何为车辆和评论执行此操作吗?就这么做了,告诉我这是否适合你,我会看一看!)我需要收集不同对象的注释。这就是为什么我这么定义它,而不是反过来定义它。使用您的方法,我将只获取车辆的注释,其他对象呢?(评论等…)谢谢你的支持,但我还是不明白为什么它会起作用。我需要它工作:user.reviews.comments,@user.vehicles.comments,user..comments。嗯,我现在不知道,但是也许这个链接可以帮助你(或者没有),也许会。非常感谢你!是 啊直截了当的解决方案。我只是想让它更漂亮:)对于那些经历过相同问题的人来说:在关联对象中:def self.comments all.collect{v|v.comments}。展平端点,就差不多了。至少它起作用了:)@Dmitri很乐意帮忙。事实上,这让我想到了——也许我会写这篇文章,然后提交给acts_as_taggable gem。这似乎是一个相当普遍的问题。这对我们许多人来说都是一个巨大的支持。:)另外,我还稍微改进了您的解决方案,使用“includes”命令,多亏了“prashantsahni”,解决了N+1查询问题。唯一让我困惑的是,(:include=>:comments)不起作用,而include(:comments)就像一个符咒。1)我需要的不仅仅是对车辆的评论。2) 这可能是错误的,但它100%正常工作。所有其他解决方案都不起作用
    @user.vehicles(:include => :comments).collect{|v| v.comments}.flatten