我应该在哪里以及如何在我的Rails应用程序中添加这种新的“非rails-way”方法

时间:2012-02-11 22:34:32

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

我已经编写了一个从MS SQL 2008服务器查询和检索的小方法,我不知道将代码放在我的rails应用程序中的哪个位置。

情景:
我正在编写一个Ruby和Rails应用程序,其中包含与旧版MS SQL 2008服务器数据库的连接。 很多都按预期工作,这很好。 现在我处理遗留数据库的副本,我将其视为只读。它很大(7000多个表,其中一些有超过4000万条记录)。我正在“按原样”使用它,并且不想更改任何底层架构。

我确实想扩展一些特定于服务器的功能。例如,我使用:

thing = ActiveRecord::Base.connection.exec_query(my_query_string_here)

......它有效。结果是一个包含哈希的数组,我可以使用:

获得相关的哈希值
thing[0][""]

......哪个有效。

所以,我认为我应该写一个方法来使这更容易,我写道:

Class Tool < ActiveRecord::Base
  def self.queryRDW(x)
    res=ActiveRecord::Base.connection.exec_query(x)
    ret=res.to_hash
    return ret[0][""]
  end
end 

并将其放在config / initializers / tool.rb中不幸的是,webrick在启动过程中抱怨文件时出现以下隐藏错误:

.../config/initializers/tool.rb:7: syntax error, unexpected keyword_end, expecting $end (SyntaxError)

我认识到这不是开箱即用的做事方式,所以请不要提醒我。 (我的挣扎经常让我想起)

我的问题:
我应该把这段代码放在哪里,以便我可以在我的rails应用程序中的控制器或视图中调用它?这需要是一个新的Class方法还是别的什么?

非常感谢!

附录:
我把班级改为班级(doh!)
我将tool.rb移动到了lib /
我将tool.rb改为现在:

module Tool
  def self.queryRDW(x)
    res = ActiveRecord::Base.connection.exec_query(x)
    res.to_hash[0][""]
  end
end

但在app/views/stats.html.erb

中执行此操作
thing=queryRDW("mysql string")

给我一​​个'未定义的方法错误'

附录2
我制作了目录app / concerns并将tool.rb放在那里 当我使用时:

<%=queryRDW("myStringHere")%>

在:

app/views/stats.html.erb

我明白了:

undefined method `queryRDW' for #<#<Class:0x0000000378ccf8>:0x00000003c1ce58>  

2 个答案:

答案 0 :(得分:4)

您需要在第1行中小写关键字class

我还说这个类不需要从ActiveRecord::Base继承 - 并且甚至不需要成为一个类 - 如果它只是exec_query的包装器。这没有什么“错误”,但是如果你从未打算实例化这个类的对象,你可以创建一个简单的实用程序模块:

module Tool
  def self.queryRDW(x)
    res = ActiveRecord::Base.connection.exec_query(x)
    res.to_hash[0][""]
  end
end

您可以将此文件保存在以下几个位置:

  1. lib/tool.rb。如果您使用的是Rails 3,则需要在config/application.rb中添加(或取消注释)此行:

    # config/application.rb
    config.autoload_paths += %W(#{config.root}/lib)
    
  2. app/concerns/tool.rb。这将由Rails 3自动检测到。
  3. 我通常使用app/concerns用于完全特定于应用程序的工具,lib用于我可能在多个不同应用程序中重用的实用程序。

答案 1 :(得分:2)

我不会把它放在config/initializers中。这似乎是您放入app/models的代码。

您获得的错误与语法有关,因此请仔细检查语法。

要更直接地回答您的问题,如果模型相关(换句话说,您的业务领域的一部分),将这些内容放在您的模型中是可以接受的。如果它与您的域名无关或正交,我会将其放入lib

希望这有帮助。