3

私の Rails 2.3 アプリでは、既存の ActiveRecord モデルと最近追加した gem との間の名前空間の衝突が問題の原因であることがわかりました。

jammit具体的には、アプリにサポートを追加しようとしていました。jammit に依存する gem の 1 つである requireは、アプリの名前空間にモジュール'platform'を導入します。しかし、私はすでにその名前の ARクラスを持っており、その名前を変更すると、多くの追加作業が発生し、バグが発生する可能性があります。Platform

クラスの名前を変更したり、実際のgemを変更したりせずに、この名前空間の衝突を防ぐ比較的簡単な方法(ルビーのメタマジックなどを使用)があるかどうか疑問に思っていました。ありがとう。

編集:

アプリ全体でクラス の名前を変更/ラップする代わりに、モジュールは他の 1 つの gem でのみ必要とされるため、両方の gem をフォークし、(元の gem とそれをインポートするものの両方で)名前を変更し、両方を再構築することになりました。 . それはうまくいったようです [ため息]。Platform PlatformPlatformXPlatform

4

2 に答える 2

4

やむを得ない場合 名義変更ができない場合

ActiveRecord クラスをモジュールにラップしてみてください

module YourModule
 class Platform < Activerecord::Base
 named_scope :your_scope, lambda {#your code here}

 end
end

だからあなたがしなければならない唯一の変更は次のようなものです

YourModule::Platform.your_scope
于 2012-09-12T07:22:48.363 に答える
0

アクションの前のクラスの先頭で、エイリアスを作成するだけです。

NewPlatform = ActiveRecord::

名前空間の競合を避けるために、そのクラスのアクションでエイリアスを使用するだけです。

于 2018-06-02T14:06:51.787 に答える