加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails:构建涉及多态关联和STI的查询

发布时间:2020-12-17 01:59:39 所属栏目:百科 来源:网络整理
导读:我正在尝试找到关于照片的10条最新评论,因此我可以将它们集成到我的Rails 3.0.3应用程序的活动源中. 我有一个Photo模型,它继承了使用单表继承的Upload模型: class Upload ActiveRecord::Base ...endclass Photo Upload has_many :comments,:as = :commentab
我正在尝试找到关于照片的10条最新评论,因此我可以将它们集成到我的Rails 3.0.3应用程序的活动源中.

我有一个Photo模型,它继承了使用单表继承的Upload模型:

class Upload < ActiveRecord::Base
    ...
end

class Photo < Upload
    has_many :comments,:as => :commentable
    ...
end

可评论的多态关联在Comment模型中描述:

class Comment < ActiveRecord::Base
    belongs_to :commentable,:polymorphic => true
end

到目前为止一切都那么好吧?当我尝试构造查询时出现问题.经过一些试验和错误,我想出了这个代码,它位于Photo模型中:

def self.latest_comments(count = 10)
    Comment.where(:commentable_type => "Upload")
       .joins("INNER JOIN uploads ON comments.commentable_id = uploads.id")
       .where("uploads.type" => "Photo").order("comments.created_at DESC").limit(count)
end

这段代码适用于我的SQLite开发机器,但是我必须做一些修改才能使用PostgreSQL在生产服务器上运行它.上面的查询化身尚未在生产服务器上进行过测试,但我一直在寻找一种更简洁的结构化查询方式,因为上面感觉不是很强大,也不是很“Railsy”.

我想要的是能够说的是

Comment.joins(:commentable => :photo)

…但是这引发了异常,大概是因为Rails不知道如何进行连接:

ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic association :commentable

我发现post on StackOverflow描述了一种查询多态关联的不同方式.我能够根据这篇文章提出以下代码:

Comment.find_all_by_commentable_type("Upload",:include => :commentable,:order => "created_at DESC",:limit => 10)

但是,这对STI不起作用:由于Photo继承自Upload,我无法直接获取与照片相关的注释 – 只有从Upload继承的所有类的注释.

我看过很多其他与多态性或STI有关的帖子,但是没有一个与我正在寻找的方式结合起来.我可以简单地讨论初始查询,但有没有人对构建涉及多态性和STI的查询的替代方法有任何想法?

编辑:我在这里沿着与我相同的路线找到了another question.不幸的是,最佳答案并未提供我正在寻找的解决方案.如果我将它应用于我的问题,我会将has_many:comments关联从Photo模型移动到Upload模型,并向Comment类添加一些代码以确定正确的可注释类.这并不理想,因为它打破了建模,因为任何上传的子类都会有注释.肯定有更好的办法…?

解决方法

您正在提供关于Upload类的注释的关联.继承自Upload的Photo将通过继承进行此关联.由于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”类型加入.在通过评论关联时,Rails将使用类名自动处理与comments表的连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读