gpt4 book ai didi

ruby-on-rails - 如何使用 ActiveRecord 按书籍数量对作者进行排序?

转载 作者:数据小太阳 更新时间:2023-10-29 07:01:20 25 4
gpt4 key购买 nike

假设我有 Book 模型和 Author 模型。我想列出所有按书数排序的作者。最好的方法是什么?

我知道如何在 SQL 中执行此操作,方法是使用嵌套选择或某些连接执行 where .. in。但我想知道的是如何使用 ActiveRecord 很好地做到这一点。

最佳答案

正如 Kevin 所建议的,counter_cache 是最简单的选项,我绝对会使用它。

class Author < ActiveRecord::Base
has_many :books, :counter_cache => true
end

class Book < ActiveRecord::Base
belongs_to :author
end

如果您使用的是 Rails 2.3,并且您希望这是默认顺序,您可以使用新的 default_scope 方法:

class Author < ActiveRecord::Base
has_many :books, :counter_cache => true

default_scope :order => "books_count DESC"
end

books_count 是执行计数器缓存行为的字段,可能有比在默认范围内直接使用它更好的方法,但它为您提供了想法并将完成工作。

编辑:

针对询问如果非 Rails 应用程序更改数据,counter_cache 是否会工作的评论,它可以,但不是默认方式,因为 Rails 在保存时递增和递减计数器。您可以做的是在 after_save 回调中编写您自己的实现。

class Author < ActiveRecord::Base
has_many :books

after_save :update_counter_cache

private
def update_counter_cache
update_attribute(:books_count, self.books.length) unless self.books.length == self.books_count
end
end

现在您还没有安装 counter_cache,但是如果您按照 counter_cache 约定将数据库中的字段命名为 books_count,那么当您查找时:

@Author = Author.find(1)
puts @author.books.size

它仍然会使用计数器缓存的数字而不是执行数据库查找。当然,这仅在 Rails 应用程序更新表格时有效,因此如果另一个应用程序执行某些操作,那么您的数字可能会不同步,直到 Rails 应用程序返回并必须保存。我能想到的解决这个问题的唯一方法是一个 cron 作业来同步数字,如果你的 Rails 应用程序没有足够频繁地查找东西以使其无关紧要。

关于ruby-on-rails - 如何使用 ActiveRecord 按书籍数量对作者进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/958558/

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