Ruby on rails Rails:构造涉及多态关联和STI的查询

Ruby on rails Rails:构造涉及多态关联和STI的查询,ruby-on-rails,ruby,polymorphic-associations,eager-loading,single-table-inheritance,Ruby On Rails,Ruby,Polymorphic Associations,Eager Loading,Single Table Inheritance,我正在尝试查找关于照片的10条最新评论,以便将它们集成到Rails 3.0.3应用程序的活动提要中 我有一个照片模型,它使用单表继承从上传模型继承而来: class Upload < ActiveRecord::Base ... end class Photo < Upload has_many :comments, :as => :commentable ... end 这段代码可以在我使用SQLite的开发机器上运行,但我必须做一些更改,才能让它

我正在尝试查找关于照片的10条最新评论,以便将它们集成到Rails 3.0.3应用程序的活动提要中

我有一个照片模型,它使用单表继承从上传模型继承而来:

class Upload < ActiveRecord::Base
    ...
end

class Photo < Upload
    has_many :comments, :as => :commentable
    ...
end
这段代码可以在我使用SQLite的开发机器上运行,但我必须做一些更改,才能让它在使用PostgreSQL的生产服务器上运行。上面的查询还没有在生产服务器上测试过,但我正在寻找一种更干净的查询结构,因为上面的查询感觉不是很健壮,也不是很“Railsy”

我想说的是

Comment.joins(:commentable => :photo)
…但这引发了一个异常,可能是因为Rails不知道如何进行连接:

ActiveRecord::急切加载多态错误:无法急切加载多态关联:可注释

我遇到了一个描述查询多态关联的不同方法的示例。基于这篇文章,我能够想出以下代码:

Comment.find_all_by_commentable_type("Upload", :include => :commentable,
        :order => "created_at DESC", :limit => 10)
但是,这对STI不起作用:因为Photo是从Upload继承的,所以我不能直接获取与photos相关的注释-只有从Upload继承的所有类的注释

我看过很多其他关于多态性或STI的帖子,但没有一篇像我所寻找的那样将两者结合起来。我可以在最初的查询中混日子,但是有没有人想到其他方法来构造一个涉及多态性和STI的查询


编辑:我在这里找到了与我相同的内容。不幸的是,上面的答案并没有提供我想要的解决方案。如果我将其应用于我的问题,我会将
has\u many:comments
关联从
Photo
模型移动到
Upload
模型,并向Comment类添加一些代码以确定
commentable
的正确类。这并不理想,因为它打破了上传的任何子类都会有注释的建模。一定有更好的方法…?

您正在提供与上传类上的评论的关联。从上载继承的照片将通过继承具有此关联。由于comments方法在Upload实例和Photo实例上都可用,因此可以编写以下方法来检索注释:

# app/models/upload.rb

def latest_comments(count=10)
  self.comments.order("created_at DESC").limit(count)
end

当使用Upload实例时,它将使用类型“Upload”连接到comments表,当使用该类实例时,它将使用类型“Photo”连接到comments表。Rails将在通过评论关联时使用类名自动处理与评论表的连接。

感谢您的回复,但是我的模型指定只有照片,而不是上传,才可以评论。如果超类
Upload
被赋予关联
有许多:注释,那么它将大大简化事情,但我不想这样做破坏我的模型。如果我不想以这种方式破坏我的模型,我想知道,在没有长链查询的情况下,我想要实现的是可能的吗?
Comment.find_all_by_commentable_type("Upload", :include => :commentable,
        :order => "created_at DESC", :limit => 10)
# app/models/upload.rb

def latest_comments(count=10)
  self.comments.order("created_at DESC").limit(count)
end