1

コマンド ライン ユーティリティを介して使用される ActiveRecord ベースのアプリケーションがあります。このようなアプリケーションでモデルの名前空間を設定すると、オブジェクトの名前空間をきれいに保つことができます。

私は、これらの ActiveRecord モデルを中心に Rails アプリケーションを構築し始めています。名前空間でモデルを使用する際の最初の問題のいくつかは克服しましたが、必要以上に冗長であることに気付きました。

私が望むのは、コマンド ライン ユーティリティで使用するときに ActiveRecord クラスの名前空間をプログラムで設定し、Rails アプリで使用するときにこれらのモデルの名前空間をプログラムで設定しないことです。

ファイル自体が必要になる前に実行時に変更される可能性があることは知っていますが、これをきれいに達成するために Ruby 言語自体で何かを探しています。

4

1 に答える 1

2

コードを見ずに素晴らしい提案をするのは難しいですが、ここに 2 つの可能性があります。

  1. このコードには 2 つのクライアントがあるようです。多分それをエンジン(ただの派手なgem)にして、自動ロードパスにパスを追加してから、レールのようながらくたを邪魔することなくgemからそれを使用できます。

  2. おそらく、定数を作成してから、モデルで再度開きます。

いくつかの初期化子で

ActualNamespace = Class.new
DynamicNamespace = ActualNamespace

モデルファイルで

class DynamicNamespace
  class MyModel
  end
end

DynamicNamespace::MyModel # => ActualNamespace::MyModel

次に、コマンドラインアプリの場合

DynamicNamespace = Object

これは、名前空間を持たないことと同じです:

DynamicNamespace::MyModel # => MyModel

さて、主にリフレクションに基づいた Rails マジックの一部で問題が発生する可能性があります。あなたが何に直面するかは完全にはわかりませんが、データを送信するときにフォームが間違ったキーを生成し始めると思います. DynamicNamespace.nameこれらの行に沿って何かまたは何かを定義することで、おそらくこれを修正できます。

オートローディングも問題になる可能性がありますが、オートロード パスを何らかの方法で宣言できると思います (確かなことはわかりませんが、「レールのオートローディング」をグーグルで検索すると、いくつかの有望な結果が得られます。Ruby のオートローディングにフックしているように見えますが、これは Ruby 2.0 ではなくなると思います) 最悪の場合、ディレクトリを熱心にロードするために railtie を定義することができます。これは私のリーグから少し外れていますが、アプリを初期化する前に Railtie を定義する必要があると思いますので、config/application.rb で railtie を要求する必要があるかもしれません。

残念なことに、結局のところ、Rails の慣習から逸脱し始めると、生活が困難になり始め、考える必要のなかったすべての魔法が崩壊するので、突然 Rails のコードベースに飛び込んで、それが何であるかを理解する必要があります。をしていました。

于 2012-09-02T02:07:31.023 に答える