Rails如何创建一个自我保持干燥的类方法?

时间:2011-02-19 03:05:26

标签: ruby-on-rails ruby ruby-on-rails-3

我多次重复这段代码。唯一改变的是条件中的名称。

find(:all, :conditions => {:name => 'hans'}, :group => 'dato').map(&:klik)

我正在尝试在模型中创建一些类方法。所以我可以保持干爽。

我一直在尝试这个并且它不起作用。

def self.grafdata(name)
    find(:all, :conditions => {:name => '(name)'}, :group => 'dato').map(&:klik)
end

错误:未初始化的常量ActionView :: CompiledTemplates :: Lars

我希望能够编写Model.grafdata(Hans),Model.grafdata(Lars)

4 个答案:

答案 0 :(得分:6)

我只是将它作为函数添加到您的模型中:

class Model
  def self.grafdata(name)
    where(name: name).group('dato').map(&:klik)
  end
end

然后您可以调用以下任一项:

Model.grafdata('Lars')
Model.grafdata('Hans')

答案 1 :(得分:3)

您可以使用named_scope:

class Model

  named_scope :grafdata, lambda {|name| {:conditions => ["name = ?", name], :group => 'dato'}}

end

然后叫:

Model.grafdata('Lars').map(&:klik)

答案 2 :(得分:2)

使用模块

module MyFinders
  def grafdata(name)
    find(:all, :conditions => {:name => '(name)'}, :group => 'dato').map(&:klik)
  end
end

class Foo < ActiveRecord::Base
  extend MyFinders
end

HTH

对等

答案 3 :(得分:-2)

而不是'(name)'它应该只是(name)

def self.grafdata(name)
    find(:all, :conditions => {:name => (name)}, :group => 'dato').map(&:klik)
end

视图:<%= Reklamer.grafdata('Lars') %>