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

ruby-on-rails – 覆盖默认范围(特别是顺序),而Rails中没有其他

发布时间:2020-12-16 20:01:02 所属栏目:百科 来源:网络整理
导读:所以基本上我有两个班,书和作者.书籍可以有多个作者,作者可以有多本书籍.书籍具有以下默认范围. default_scope :order = "publish_at DESC" 在作者展示页面上,我想列出与该作者相关联的所有书籍,所以我说下列内容: @author = Author.find(params[:id])@book
所以基本上我有两个班,书和作者.书籍可以有多个作者,作者可以有多本书籍.书籍具有以下默认范围.
default_scope :order => "publish_at DESC"

在作者展示页面上,我想列出与该作者相关联的所有书籍,所以我说下列内容:

@author = Author.find(params[:id])
@books = @author.books

一切都很好,到目前为止.作者#显示页面列出按出版日期排列的所有作者.

我也在研究一种能够按照一本书的流行排列的宝石.

@books = @author.books.sort_by_popularity

问题是每当它尝试排序时,default_scope总是会阻碍.如果我尝试去除它之前,它会摆脱作者的关系,并返回数据库中的每本书.例如

@books = @author.books.unscoped.sort_by_popularity # returns all books in database

我想知道是否可以使用ActiveRelation except() method
做这样的事情(这似乎应该工作,但它不会,它忽略了顺序,只是当它是一个default_scope命令)

def sort_by_popularity
  self.except(:order).do_some_joining_magic.order('popularity ASC')
  #    |------------|                       |---------------------|
end

任何想法,为什么这不工作?关于如何让这个工作有其他方式的任何想法?我知道我可以摆脱default_scope,但我想知道是否有另一种方法来做到这一点.

解决方法

您应该可以使用 reorder完全替换现有的ORDER BY:

reorder(*args)
Replaces any existing order defined on the relation with the specified order.

所以这样的事情

def self.sort_by_popularity
  scoped.do_some_joining_magic.reorder('popularity ASC')
end

而且我想你想使用一个类的方法,而不是自我,但我不知道整个上下文,所以也许我错了.

我不知道为什么除了不行. default_scope似乎应用在最后(排序),而不是开始,但我没有看到这么多.

(编辑:李大同)

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

    推荐文章
      热点阅读