我有一个Photo模型,它继承了使用单表继承的Upload模型:
class Upload < ActiveRecord::Base ...endclass Photo < Upload has_many :comments,:as => :commentable ...end
可评论的多态关联在Comment模型中描述:
class Comment < ActiveRecord::Base belongs_to :commentable,:polymorphic => trueend
到目前为止一切都那么好吧?当我尝试构造查询时出现问题.经过一些试验和错误,我想出了这个代码,它位于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.rbdef latest_comments(count=10) self.comments.order("created_at DESC").limit(count)end
当使用Upload实例时,这将使用“Upload”类型连接到comments表,当使用该类的实例时,它将使用“Photo”类型加入.在通过评论关联时,Rails将使用类名自动处理与comments表的连接.
总结以上是内存溢出为你收集整理的ruby-on-rails – Rails:构建涉及多态关联和STI的查询全部内容,希望文章能够帮你解决ruby-on-rails – Rails:构建涉及多态关联和STI的查询所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)