2

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

这种关系通常如何解决?

4

2 回答 2

2

在 Rails 3 中,您可以使用带参数的范围

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

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

您可以按如下方式使用范围:

@author.campings.top(5)
于 2013-01-16T13:09:21.397 回答
1

您可能希望以top这种方式在您的 Camping 类中定义:

class Camping < ActiveRecord::Base
  def self.top(count)
    order(:created_at).limit(count)
  end
end

当您将其定义为类方法时,它可以通过 获得ActiveRecord::Relation,因此您可以调用@author.campings.top(5)

于 2013-01-16T13:09:58.290 回答