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

标签 ruby-on-rails scope rails-activerecord

我有一个Camping,其中有一个作者。一位作者有很多露营

获取“前 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 是定义“top”的正确位置,而不是 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/

相关文章:

ruby-on-rails - 在模型验证失败时在类型转换之前显示属性

php - if 语句的变量作用域问题 (PHP)

mysql - rails : has_and_belongs_to_many not saving associated objects (null in join table)

ruby-on-rails - rails - 已安装 rails 但无法创建应用程序 "cannot load such file -- active_support"

iOS 使用参数获取对 Rails API 的请求

python - 当你有一个名为 max 的变量时使用 Python 的 max 函数?

java - Scala 范围、初始化

ruby-on-rails - Rails 4 View 渲染非常慢

ruby-on-rails - 有没有办法将命名范围组合成一个新的命名范围?

ruby-on-rails - 由于 "Please install the postgresql adapter"错误,在新创建的不使用 postgres 的应用程序中,Rails 控制台无法打开