gpt4 book ai didi

ruby-on-rails - 仅覆盖默认范围(特别是订单),而不覆盖 Rails 中的其他任何内容

转载 作者:行者123 更新时间:2023-12-04 00:11:47 25 4
gpt4 key购买 nike

所以基本上我有两个类,预订 作者 .一本书可以有多个作者,作者可以有多本书。书籍具有以下默认范围。

default_scope :order => "publish_at DESC"

在作者展示页面上,我想列出与该作者相关的所有书籍,所以我说以下...
@author = Author.find(params[:id])
@books = @author.books

到目前为止一切都很好。 author#show 页面列出了按出版日期排序的属于该作者的所有书籍。

我还在研究一种能够按书籍受欢迎程度排序的 gem。
@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

我认为您想为此使用类方法和 scoped而不是 self但我不知道整个背景,所以也许我错了。

不知道为什么 except不起作用。 default_scope似乎在最后(有点)而不是在开始时得到应用,但我并没有研究那么多。

关于ruby-on-rails - 仅覆盖默认范围(特别是订单),而不覆盖 Rails 中的其他任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9745899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com