扩展gem / engine模型以包含来自主应用程序的acts_as_tenant

时间:2014-02-12 13:40:35

标签: ruby-on-rails ruby-on-rails-4 acts-as-tenant

关于此主题有一些帖子,但灯还没亮。

我正在尝试扩展rails gem / engine Plutus以使用acts_as_tenant

Plutus为应用程序提供双重记帐系统。其中一个限制是该设计仅允许一个客户或一套书籍。我想要做的是使用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

然后关于账户的资产类:资产,权益,费用,责任,收入和金额上的sti类:DebitAmount,CreditAmount。这有点超出了我的轨道知识,但这可能是我见过的最紧凑的双入口计划(我不是会计师,但我过去必须在应用程序上添加会计功能)。

半工作意味着我在Plutus中修改的唯一内容是在三个模型中添加tenant_id并获取acts_as_tenant以扩展三个模型中的两个。从主应用程序的控制台我发现:

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

适用于帐户和交易,但有uninitialized constant Transaction的金额错误,我不知道为什么。有什么想法吗?

我已阅读引擎上的rails指南并使用装饰器或关注点进行扩展,但尚未弄清楚如何使用这些方法将acts_as_tenant(:tenant)发送到模型。我会在主应用程序中将这三行代码放在哪里(假设我弄清楚如何让Amount工作!)

有更好的方法吗?

我仍然有一些类方法需要扩展或修改,但在我克服第一道障碍之前没有尝试过。

1 个答案:

答案 0 :(得分: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电话的最佳位置。我把它们放在Concerns目录中,但没有被调用。最后将它们放入我的租户模型中,一切都很好。