我有一个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/