繁体   English   中英

Ruby / Rails 元编程:动态生成辅助方法

[英]Ruby / Rails metaprogramming: generating helper methods on the fly

我正在尝试为给定的 model 名称数组动态生成一些计数方法,然后我可以在视图/帮助器中使用它们:

  # 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. 如果我希望能够在视图中调用这些方法,那么这个代码 go 应该在哪里?
  2. 这些方法将添加到哪些 class 中? 例如,我将如何 go 关于调用它们,因为我不确定它们是否属于用户等。 class 因为它们适用于一堆模型。
  3. 有没有更好的方法来做到这一点?

您应该使用 mixin 并将其包含在相关的 model 类中。 http://juixe.com/techknow/index.php/2006/06/15/mixins-in-ruby/

这些方法将在您的视图中的 model 实例上可用。

您试图解决的问题(防止您的视图点击 model 方法)无法通过将相同的逻辑委托给视图助手来解决。 如果您想遵守 MVC 约定以防止您的视图触发 SQL 查询,则应该在控制器中执行此操作。

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

然后你有一个很好的 hash 每个模型通过的计数:

@counts #=> { :foo => 3, :bar => 59, :bat => 42 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM