2012-02-11 4 views
0

MS SQL 2008サーバからクエリを実行して取得する小さなメソッドを書いています。私のレールアプリで。Railsアプリケーションでこの新しい 'non-rails-way'メソッドをどこに追加するのですか

シナリオ:
私はレガシーMS SQL 2008サーバーのDBに接続してRubyとRailsのアプリを書いています。 多くのものが期待どおりに動作していますが、これは素晴らしいことです。 今のところ、私はレガシーDBのコピーを取り除き、私はそれを読み取り専用として扱います。それは大きかった(7000 +テーブルの中には4,000万レコード以上のものがある)。私はそれをそのままの状態で使用しており、根底にあるスキーマを変更したくない。

非常にサーバー固有の機能をいくつか拡張したいと考えています。たとえば、私は次のものを使用します:

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 

をし、残念ながら設定/初期化子/ tool.rbに入れ、WEBrickにはしてブート時にファイルについて不平を言います潜在的なエラーの後に:

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

私はこのことが決まっていることを認識していますので、私に思い出さないでください。 (私の闘争は、多くの場合、十分に私を思い出させる)

私の質問:私は、コントローラや私のレールのアプリでビュー内から呼び出すことができるように、このコードを配置する必要があり
?これは新しい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> 

答えて

4

あなたはラインでキーワードclassを小文字する必要があります。1.

私もこのクラスは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の私は、いくつかの異なるアプリケーション間で再利用する可能性があるユーティリティの完全アプリケーション固有およびlibなツール3.

私は、一般的に使用app/concernsによって検出されます。

+0

mg。ありがとう。 'unexpected keyword_end'が固定され、webrickが起動します。今、ビューでqueryRDWを呼び出そうとすると、#<#:0x00000003632718>のための未定義のメソッド 'queryRDW 'が得られます。 –

+0

私は私の答えを更新した後までこのコメントを見ませんでした。質問を編集し、このエラーを生成するビューにコードを追加できますか? – Brandan

+0

完了。ここに私を助けてくれてありがとう。 –

2

私はconfig/initializersでこれを入れないでしょう。これはapp/modelsに入れるコードのようです。

エラーは構文に関連しているので、構文を再確認してください。

あなたの質問に直接答えるには、モデルに関連している(つまり、ビジネスドメインの一部である)場合は、このものをモデルに入れても問題ありません。あなたのドメインに無関係なものであれば、私はlibに入れます。

これが役に立ちます。

+0

tool.rbファイルをapp/modelsに移動する必要がありますか? queryRDW()を呼び出す構文は何ですか? –

+0

はい、適切です。また、このクラスが実際のActive Recordテーブルを実際にモデル化していない場合、私は単に 'app/models'の中の普通のrubyオブジェクトにします。あなたがそれをどのように呼び出すかについては、私はその質問を理解しているかどうか分からない。他のオブジェクトのように扱うだろう。あなたはそれをどのように使用しようとしているかについてもう少し詳細を投稿できますか? –

+0

ありがとうございます。私は今、このクラスを作ることがおそらく正しいとは限りません。ツールテーブルまたはツールオブジェクト自体はありません。 –

関連する問題