7

会計機能を実行するRailsアプリケーションを構築しています。この一環として、クラス名が のモデルがありTransactionます。これまでのところ、私はこの機能を 1 か月ほど構築してきましたが、すべてが期待どおりに機能しています。

今まで...

Ruport ライブラリを使用して数か月前に開発された古いレポート機能が機能しなくなっていることを発見しました。Ruport は、PDF を生成するときに、 という名前のクラス/モジュールも持つライブラリを必要とするようですTransaction

TypeError in Admin/team reportsController#generate
Transaction is not a module

...

This error occurred while loading the following files:
  pdf/writer
  transaction/simple

だから、私はここで簡単な修正を探しています。Transactionモデルの名前を変更したり、過去数週間分のコードをリファクタリングしたりしないことを願っています。

いくつかの賢い提案を楽しみにしています:)

4

3 に答える 3

15

すでに回答済みで古いですが、同じ問題でここに来ましたが、別の方法で解決しました。

Pull と Query という名前の 2 つのモデルがあります。Query.some_static_method()Pull のメソッド内で参照しようとすると、Query が に解決されましたActiveRecord::AttributeMethods::Query:Module

空の名前空間を前に置くことで解決しました::Query.some_static_method()

于 2010-11-17T15:32:55.153 に答える
8

この問題は、モジュール Transaction を定義する Transaction::Simple gem を必要とする PDF::Writer gem を必要とする Ruport にあると思います。

ActiveRecord には確かに #transaction メソッドがありますが、Rails 内に Transaction モジュールまたはクラスはないと思います。私はそれについて修正されてうれしいです。

通常、このような名前の競合を回避するためのベスト プラクティスは、ネームスペースです。例えば

module Account
  class Transaction < ActiveRecord::Base
    ....
  end
end 

ただし、ActiveRecord モデルの名前空間は他の問題を引き起こす可能性があります。

時間がかかるかもしれませんが、トランザクション モデルの名前を変更するのが最善の策かもしれません。

必要に応じて、既存のトランザクション データベース テーブルを引き続き保持できるため、self.table_name = "transactions"モデル内に配置することで、移行を変更する必要はありません。

アソシエーション コールで class_name を指定することにより、他のモデルとのアソシエーションに「トランザクション」という名前を付けることもできます。例えば

class User < ActiveRecord::Base

  has_many :transactions, :class_name => "AccountTransaction"

end

これらの 2 つの提案により、時間を節約できる場合とそうでない場合があります。

于 2010-09-17T13:48:12.370 に答える
1

この問題は、Transaction が Rails の予約語でもあることに起因している可能性があります…</p>

于 2010-09-17T13:20:43.797 に答える