0

この件に関する投稿はいくつかありますが、まだ点灯していません。

私は、Rails gem/engine Plutusを拡張して、 acts_as_tenantを使用しようとしています。

Plutus は、アプリケーション用の複式簿記システムを提供します。制限の 1 つは、設計上、1 人の顧客または 1 セットの本しか許可されないことです。私がやろうとしているのは、acts_as_tenant を使用してマルチテナンシーを追加し、Plutus エンジンへの変更をできるだけ少なくすることです。目標は、別のフォークで Plutus を大幅に変更することではなく、複数のアカウントが必要な場合にのみ使用されるいくつかのオプションのメソッドまたは属性を Plutus に追加することです。

私はそれを半分動作させていますが、物を置く場所を見つけるのに助けが必要で、何が機能していないかを片付けるのに役立ちます. 凝縮された Plutus モデルは次のとおりです。

class Account < ActiveRecord::Base
    has_many :credit_amounts, :extend => AmountsExtension
    has_many :debit_amounts, :extend => AmountsExtension
    has_many :credit_transactions, :through => :credit_amounts, :source => :transaction
    has_many :debit_transactions, :through => :debit_amounts, :source => :transaction
end

class Amount < ActiveRecord::Base
  belongs_to :transaction
  belongs_to :account
end

class Transaction < ActiveRecord::Base
   belongs_to :commercial_document, :polymorphic => true
   has_many :credit_amounts, :extend => AmountsExtension
   has_many :debit_amounts, :extend => AmountsExtension
   has_many :credit_accounts, :through => :credit_amounts, :source => :account
   has_many :debit_accounts, :through => :debit_amounts, :source => :account
end

次に、Account の sti クラス: Asset、Equity、Expense、Liability、Revenue、および Amount の sti クラス: DebitAmount、CreditAmount。これは私のレールの知識を少し超えていますが、これは私が今まで見た中で最もコンパクトな複式簿記スキームの可能性があります (私は会計士ではありませんが、過去にアプリに会計機能を追加する必要がありました)。

セミワーキングとは、私が Plutus で変更した唯一のことは、3 つのモデルに を追加し、tenant_idacts_as_tenant を取得して 3 つのモデルのうちの 2 つを拡張することです。メインアプリケーションのコンソールから、次のことがわかりました。

Plutus::Account.acts_as_tenant(:tenant)
Plutus::Amount.acts_as_tenant(:tenant)
Plutus::Transaction.acts_as_tenant(:tenant)

Account と Transaction では機能しますが、 Amount でエラーが発生しuninitialized constant Transaction、理由がわかりません。何か案は?

acts_as_tenant(:tenant)エンジンに関するレールガイドを読み、デコレーターまたは懸念事項で拡張しましたが、これらのアプローチを使用してモデルに送信する方法がわかりませんでした。この 3 行のコードをメイン アプリケーションのどこに配置すればよいでしょうか (Amount を機能させる方法を理解していれば!)?

より良いアプローチはありますか?

拡張または変更しなければならないクラス メソッドがまだいくつかありますが、この最初のハードルを乗り越えるまでそれを試しても意味がありません。

4

1 に答える 1

0

問題は、Plutus が名前空間エンジンであり、エンジン内で正常に動作する一方で、エンジン (メイン アプリ) の外部から呼び出すと、競合が発生する可能性があることでした。

これを修正するために、関連付けに class_name オプションが追加されました。

module Plutus
    class Amount < ActiveRecord::Base
      belongs_to :transaction, class_name:"Plutus::Transaction"
      belongs_to :account, class_name:"Plutus::Account"

      validates_presence_of :type, :amount, :transaction, :account
    end
end

電話をかけるのに最適な場所はまだわかりませんActsAsTenant。私はそれらを懸念ディレクトリに貼り付けましたが、呼び出されませんでした。それらをテナントモデルに配置することになりましたが、すべて問題ありません。

于 2014-02-14T20:28:01.270 に答える