gpt4 book ai didi

ruby-on-rails - 从相关对象中获取前 x 个项目

转载 作者:行者123 更新时间:2023-12-04 05:15:13 25 4
gpt4 key购买 nike

我有一个 Camping其中有一个 Author .一个 Author有很多Campings .

获得定义为“最后 5 次露营”的“前 5 名”是通过以下方式完成的:

@author.campings.order(:created_at).limit(5)

但是如果将“前 5 名”移到 Camping 模型中,我希望这个概念,这对我来说似乎更干净;毕竟, Camping是唯一知道什么的人 top是。

就像是
@author.campings.top

但是如何在 Camping 上定义它? @author.campings不是 Camping , 但一个 ActiveRecord::Relation .因此,models/camping.rb 中的以下内容不起作用:
# Scope for "top" campings
def top(amount)
self.order("created_at").limit(amount)
end

用作
@author.top(5)

现在,我只需要通过关系 @author 这个“顶级”的东西。在上述例子中。目前,“顶级”的定义只是“最近 5 次露营”,但在下一次迭代中,这将根据 Camping 上的观看次数、评分或其他参数和字段的数量而变得更加复杂。 .这让我相信 Camping是定义“顶部”的正确位置,而不是 Author .

我可以将此添加到 Author ,但是以我有限的知识,感觉就像违反了隔离模式;作者突然需要了解 Camping 上的字段:
# Last 5 campings for this author
def top_campings(amount)
campings.order("created_at").limit(amount)
end

用作
@author.top_campings(5)

这种关系通常如何解决?

最佳答案

在 Rails 3 中,您可以使用 scopes with arguments :

class Camping < ActiveRecord::Base
scope :top, lambda { |amount| order("created_at").limit(amount) }
end

(和在 Camping 中添加一个类方法一样,我想这两种方式都可以,所以你可以选择你喜欢的一种)

您可以按如下方式使用范围:
@author.campings.top(5)

关于ruby-on-rails - 从相关对象中获取前 x 个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14359154/

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