2011-12-23 6 views
3

私はマルチテナントレールアプリを稼働しています。私は(ここでは、この記事のモデルのような)現在のテナントにスコープたい モデルは、これは素晴らしい作品。このレールモデルの条件付きクラス継承

class Article < TenantScoped 

end 

ようtenantscopedモデルを継承します。私は現在のテナントにスコープされたオブジェクトを受け取るだけです。

ここで私はすべてのテナントに記事を追加できる管理者インターフェースを作成しています。私の管理インターフェースはテナントとして機能しており、モデルはその範囲に入っています。 エントリが表示されずに終了します。

私はRubyのクラスとhaventはために条件付きの継承に周りに検索してきたこれまでの最善の解決策は、条件付きでこの

class Article 

    unless SudoTenant.current? 
    < TenantScoped 
    else 
    < ActiveRecord::Base 
    end 

end 

などのテナントスコープモデルから継承していることを提案していますが、まだ何かを発見しました。私の構文はここで間違っているか、これは可能ですか?事前

+1

これは不可能です。状態条件に基づいてモジュールを条件付きで含めることはできますが、継承は含めることはできません。 –

答えて

0

ありがとうございますブロックの構文を使用してクラスを定義することができます

if SudoTenant.current? 
    Article = Class.new(ActiveRecord::Base) do 
    # your code 
    end 
else 
    Article = Class.new(TenantScoped) do 
    # your code 
    end 
end 

私は強く代わりに条件付きで継承のミックスインを使用することをお勧めします、それは、クリーナーより明確かつ明白です。

0

あなたは尋ねるものではありませんが、私はと同じのもの(テナントアプリのグローバル記事)を作成しています。

することは、私はこのようなものを持っている:

#article.rb 
def self.global 
    unscoped.where(:company => Company.admin) 
end 


#company.rb 
def self.admin 
    where(:name => 'admin').first # this can pretty much be anything that fits to you. 
end