Ruby on rails Rails如何创建自己的类方法来保持干燥?

Ruby on rails Rails如何创建自己的类方法来保持干燥?,ruby-on-rails,ruby,ruby-on-rails-3,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 => 'da

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

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)

使用模块

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

class Foo < ActiveRecord::Base
  extend MyFinders
end
模块MyFinder
def grafdata(名称)
查找(:all,:conditions=>{:name=>'(name)},:group=>'dato').map(&:klik)
结束
结束
类Foo


Peer

我只想将其作为一个函数添加到您的模型中:

class Model
  def self.grafdata(name)
    where(name: name).group('dato').map(&:klik)
  end
end
然后,您可以调用以下任一选项:

Model.grafdata('Lars')
Model.grafdata('Hans')
而不是“(名称)”,它只能是(名称)


视图:

您可以使用命名范围:

class Model

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

end
然后,我打电话给:

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

模块应该放在哪里?我用错误日志更新了帖子。我如何设置条件和按日期排序?您可以用where(…)设置条件。我的示例将数据库名称与传入的名称相匹配。使用order函数按日期排序:where(…).order('dato DESC').group('dato')…为什么要使用where而不是find?它的作用域是有限的,因此不会立即执行查询,因此很容易对其进行扩展。至少在我看来,它还是一种更干净、更容易阅读的格式。
Model.grafdata('Lars').map(&:klik)