2

私は を持ってCampingいますAuthor。アンAuthorにはたくさんありCampingsます。

「最後の 5 回のキャンプ」として定義される「トップ 5」を取得するには、次のようにします。

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

しかし、「トップ 5」がキャンプ モデルに移行されるのであれば、このコンセプトが望ましいと思います。結局のところ、何がCamping何であるかを知っているのは彼だけtopです。

何かのようなもの

@author.campings.top

しかし、これを定義する方法はCamping? @author.campingsではなくCampingActiveRecord::Relationです。したがって、models/camping.rbの次のようなものは機能しません。

# Scope for "top" campings
def top(amount)
  self.order("created_at").limit(amount)
end

使用されます

@author.top(5)

今のところ、@author上記の例では、関係を介してこの「トップ」のものだけが必要です。今のところ、「トップ」の定義は単純に「過去 5 回のキャンプ」ですが、次のイテレーションでは、ビューの量、評価、またはその他のパラメータとフィールドに基づいて、より複雑になりますCampingCampingこれは、「トップ」を定義する正しい場所であると私に信じさせますAuthor

これを に追加することもできますAuthorが、私の限られた知識では、分離パターンに違反しているように感じます。作成者は突然、キャンプのフィールドについて知る必要があります。

# 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

Camping クラスで次のように定義topします。

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 に答える