0

私はいくつかのモデルを定義するアプリケーションを持っています。アプリケーションから私のエンジンにいくつかのモデルの機能を拡張したい(例えば、メソッドの追加、関連付けの追加)。 エンジンのモデルをアプリケーションのモデルと同じ名前で追加しようとしましたが、Railsは自動的にそれらをマージしますが、動作しません。レールのエンジンでアプリケーションのモデルを拡張

例えば:私はarticles.metrics @アクセスしようとすると、 (アプリケーションのモデル)

class Article < ActiveRecord:Base 
def from_application 
    puts "application" 
end 
end 

(Inside my Engine) 
module MyEngine 
    class Article < ::Article 
    has_many :metrics, :class_name => 'Metric' 
    end 
end 

にhas_manyアソシエーションが私の記事をモデルに適用なっていません。何か案は ?

+0

私はclass_evalがあなたが探しているものだと思います。私はそれについての経験はありませんが、最近これを読んでいます:http://edgeguides.rubyonrails.org/engines。html#overriding-models-and-controllers – siax

+0

@Arun Kumar M、あなたのメトリクスモデルにarticlesとbelongs_toの関連がありますか?どのように移行され、メトリックテーブルにarticle_idが保持されますか。正確なエラーメッセージは何ですか? –

+0

@OlalekanSogunleはい私はそうです!私はそれを二重にチェックしました。 –

答えて

0

メトリクスモデルにarticlesとbelongs_toの関連付けを設定していますか。

アソシエーションのもう一方の側に、metrics a belongs_toアーティクルが正しく機能するようにすることができます。また、メトリクス表でarticles_idを保持するための移行があることを確認してください。すべてがうまくいくはずです。

+0

はい私はそうです!私は協会を持っている –

1

あなたは正しいアイデアを持っており、近いです。しかし、あなたの実装は少しです。

通常、お客様のエンジンはで、ホストアプリケーションの知識はである必要があります。そうすれば、あなたのエンジンとホストアプリケーションは疎結合したままになります。したがって、エンジンのクラスはではなく、はホストアプリケーションのクラスから継承されます。 (あなたのアプローチはうまくいきませんが、ルビーは一定のルックアップを行う方法のために考えていますが、それは別の議論です)

代わりにincluded hookを使用してください。

class Article < ActiveRecord:Base 
    include FooEngine::BarModule 

    def from_application 
     puts "application" 
    end 

    end 

そして、エンジン内部:

module FooEngine 
    module BarModule 
     def self.included(base) 
     base.class_eval do 
      has_many :metrics, :class_name => 'Metric' 
     end 
     end 
    end 
    end 

RubyインタプリタがArticleFooEngine::BarModuleが含まれるようになると(もし見つかれば)、それは探し、実行するホストアプリでは、あなたのような何かをのself.includedメソッド、クラスをbaseとする。あなたはどんな猿ビジネスあなたは、まで(その場に新しいメソッドを定義している含めるか、または他のモジュールを拡張する方法かを追加できるように

あなたはその後、baseArticle)にclass_evalを呼び出すArticleクラスを再オープンします 、など)。

例では、has_manyによって提供されるさまざまな関連付けメソッドを作成するhas_manyメソッドを呼び出します。

(a)エンジンを通じて多くのメトリック関連機能を追加する場合、(b)メトリック関連の機能を利用するクラスがたくさんある場合、(c)必要な場合いくつかの機能がクラスごとに異なる場合は、acts_as_having_metrics(またはこれに類するもの)の作成を検討することもできます。一度この道を進むと、それは驚くべきメタプログラミングのまったく新しい世界です。

幸運のベスト。

関連する問題