2017-01-17 12 views
0

同じモジュール内のコードだけにアクセスできるようなモデルを用意する方法はありますか?Railsモデルがモジュールの外部にアクセスできないようにすることはできますか?

のような何か:

module SomeModule 
    class SomeActiveRecordModel 
    # has attribute `some_attribute` 
    ... 
    end 
end 

module SomeModule 
    class SomeOtherClass 
    def self.sum_of_attribute 
     SomeActiveRecordModel.sum(:some_attribute) 
    end 
    end 
end 

class OutsideOfModule 
    def self.sum_of_attribute 
    SomeModule::SomeActiveRecordModel.sum(:some_attribute) 
    end 
end 

SomeModule::SomeOtherClass.sum_of_attribute # works 
OutsideOfModule.sum_of_attribute # raises error 
+0

このエラーは既に発生していませんか? 'OutsideOfModule'から、クラスを参照するには' SomeModule :: SomeActiveRecordModel'を行う必要があります。 –

+0

真実ですが、私の質問のポイントではありません。私は 'OutsideOfModule'の中のメソッドを更新します – bmasc

答えて

0

短い答えはノーです。理由は次のとおりです

理想的には、SomeModuleに実装します。しかし、他のクラスでSomeModule::SomeOtherClass.sum_of_attributeを呼び出すと、あなたはSomeModule::SomeOtherClassの範囲にいます。

SomeModule::SomeActiveRecordModel.sum(:some_attribute) 
         || 
         \/ 
module SomeModule 
    class SomeActiveRecordModel 
    def sum(*args) 
     # Here, self => SomeModule::SomeActiveRecordModel 
     # That's why you won't be able to do any meta trick to the module 
     # or classes in the module to identify if it's being invoked outside 
    end 
    end 
end 

元の発信者が誰かわからない場合は、

これを行うには、コールスタックを調べることができます。ここに別のSO threadがあります。そのパスを下ろす場合は参考になります。

0

要するに、しかし、これはRubyのアプローチと哲学の問題です。あなたが探しているものに似た何かを達成するためのコードについて考えてみるには、Rubesqueのような方法があります。

This answerは、物事を非公開にするさまざまな方法をカバーしています。

関連する問題