2

ビュー/ヘルパーで使用できるモデル名の特定の配列に対して、いくつかのカウントメソッドを動的に生成しようとしています。

  # create dynamic count methods for each model we want                   
  ['model', 'other_model', 'next_model'].each do |name|
     class_eval{
       "def total_#{name.underscore}s_count
          total_#{name.underscore}s_count ||= #{name.camelcase}.all.count
        end"
      }
  end

ただし、いくつか質問があります。

  1. ビューでこれらのメソッドを呼び出せるようにするには、このコードをどこに配置する必要がありますか?
  2. これらのメソッドはどのクラスに追加されますか?たとえば、それらは多数のモデル用であるため、Userなどのクラスに属しているかどうかわからないため、どのように呼び出すのでしょうか。
  3. これを行うためのより良い方法はありますか?
4

2 に答える 2

3

ミックスインを使用して、関連するモデル クラスに含める必要があります。http://juixe.com/techknow/index.php/2006/06/15/mixins-in-ruby/

メソッドは、ビューのモデル インスタンスで使用できます。

于 2011-06-08T13:57:17.333 に答える
1

解決しようとしている問題 (ビューがモデル メソッドにヒットしないようにする) は、同じロジックをビュー ヘルパーに委譲しても解決されません。ビューが SQL クエリをトリガーしないようにするという MVC 規則に固執する場合は、コントローラーでこれを行う必要があります。

def index
  models = Foo, Bar, Bat
  @counts = models.inject({}) do |result, model|
    result[model.name.downcase.to_sym] = model.count
    result
  end
end

次に、渡された各モデルのカウントの素敵なハッシュを取得します。

@counts #=> { :foo => 3, :bar => 59, :bat => 42 }
于 2011-06-08T17:20:39.830 に答える