我已经编写了一个从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>
答案 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
您可以将此文件保存在以下几个位置:
lib/tool.rb
。如果您使用的是Rails 3,则需要在config/application.rb
中添加(或取消注释)此行:
# config/application.rb
config.autoload_paths += %W(#{config.root}/lib)
app/concerns/tool.rb
。这将由Rails 3自动检测到。我通常使用app/concerns
用于完全特定于应用程序的工具,lib
用于我可能在多个不同应用程序中重用的实用程序。
答案 1 :(得分:2)
我不会把它放在config/initializers
中。这似乎是您放入app/models
的代码。
您获得的错误与语法有关,因此请仔细检查语法。
要更直接地回答您的问题,如果模型相关(换句话说,您的业务领域的一部分),将这些内容放在您的模型中是可以接受的。如果它与您的域名无关或正交,我会将其放入lib
。
希望这有帮助。