2016-10-04 11 views
0

私は基本的に請求書発行システムであるRails Appを持っています。アプリケーション内には、misc_chargesのコードと説明を保持する2つのテーブルがあります(例:id:1、code: '01' desc: 'Apples'、id:2、code:'02 '、desc:' Bananas ' ID:1、コード: '30'、desc: 'クーポン'、id:2、コード: '31'、desc: 'AAA rebate'など)があります。これらのコードはあまり変更されることはなく、コードを変更または削除するのではなく、コードを追加する可能性があります。テーブルを配列定数に読み込む

現在、メイントランザクションテーブルに英数字コードが格納されています。例えば ​​'01'、 '02'、 '30'、 '31'などのように。私はrails/postgresqlで生成されたidを使用することができましたが、アルファコードを使用する理由は、これらの英数字コードをその他の料金とクレジットの主な識別子として使用する別のシステムに輸出してインポートする必要があるからです。

いずれにせよ、ユーザー(または管理者)がトランザクション履歴または特定の請求書を確認すると、トランザクションテーブルを使用して、モデルメソッドを使用して英数字コードの特定の説明が取得されます。

私はこれを使用するビューで次に
class MiscCharge < ActiveRecord::Base 
    def self.get_desc(r_code) 
    result = MiscCharge.select("misc_charges_desc").where("code = ?", r_code) 
    return result[0].misc_charges_desc 
    end 
end 

<td> 
    <%if p.type == "R"%> 
    <h5 align ="left"><%=MiscCharge.get_desc(p.code)%></h5> 
    <% else %> 
    <h5 align ="left"><%=Credit.get_desc(p.code)%></h5> 
    <% end %> 
</td> 

現在、アプリケーションが開発モードであり、我々は、ステージング環境でいくつかのテストをやっています。私たちはたくさんのトランザクションを持っているわけではありませんが、すべてのコードの説明を表示するようにモデルを呼び出すと、トランザクションカウントが急上昇するときや、複数のユーザーがアプリケーションを使用しているときに、同時に。

これらのコードと説明を読み込む方法はありますか?本質的には静的なものがほとんどですが、定数として配列に入れますか?私はあなたがapplication.rbまたはinitializersフォルダで定義できるRuby on Rails定数についての記事を見てきましたが、私が見た例は主に静的なデータです...テーブルからロードされたものではありません...モデルが利用可能ですかapplication.rbまたはイニシャライザからデータを取得するには?

それがこの

misc_charges_array = MiscCharge.select(:id, :code, :desc).map {|e| e.attributes.values} 

またはそれにもっと何かがあるをやってような単純なことはできますか?

これを配列に入れたら、ビューでモデルメソッド呼び出しを置き換えて、適切な説明を取得する方法はありますか?

答えて

1

私はそのクラスのメソッド内でキャッシュを維持するお勧めしたいけれどもあなたは、かなり接近している:

class MiscCharge < ActiveRecord::Base 
    def self.get_desc(r_code) 
    # pre-fill the array 
    @misc_charges_by_code ||= MiscCharge.select(:id, :code, :desc).map {|e| e.attributes.values}.inject({}) {|memo, charge| memo[charge.code] = charge; memo } 
    return @misc_charges_by_code[r_code] if @misc_charges_by_code[r_code] 
    result = MiscCharge.select("misc_charges_desc").where("code = ?", r_code) 
    return @misc_charges_by_code[r_code] = result[0].misc_charges_desc 
    end 
end 

あなたがキャッシュされたものにアクセスする必要がある場合は、MiscCharge.instance_variable_get("@misc_charges_by_code")を使用しても、MiscCharge.instance_variable_set("@misc_charges_by_code", {})

0
を、それを一掃することができます

トーマスの答えはトリックでしたが、少し調整する必要がありましたが、最終的にはうまくいきました。 [2、 "Tax Seminar Fee"、 "07"]のための "未定義メソッド` code 'というエラーが発生しました:配列 "

マップ関数の結果が配列なので、コードプロパティを持つ。私は注射機能について読んで理解することができました。

最終結果はこの

@misc_charges_by_code ||= MiscCharge.select(:id, :code, :misc_charges_desc).map {|e| e.attributes.values}.inject({}) {|memo, misc| memo[misc[2]] = misc[1]; memo} 
return @misc_charges_by_code[r_code] if @misc_charges_by_code[r_code] 
result = MiscCharge.select("misc_charges_desc").where("code = ?", r_code) 
return @misc_charges_by_code[r_code] = result[0].misc_charges_desc 
のように見えます
関連する問題