扩展gem/引擎模型以包括来自主应用程序的acts_as_tenant



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

我正在尝试扩展rails宝石/引擎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类:资产、股权、支出、负债、收入,以及金额上的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)

适用于Account和Transaction,但在Amount和uninitialized constant Transaction上有错误,我不知道为什么。有什么想法吗?

我已经阅读了关于引擎和使用装饰器或关注点进行扩展的rails指南,但还没有弄清楚如何使用这些方法将acts_as_tenant(:tenant)发送到模型。我应该把这三行代码放在主应用程序的哪里(前提是我知道如何让Amount工作!)?

有更好的方法吗?

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

问题是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呼叫的最佳位置。我把他们放在关注目录里,他们没有接到电话。最后把它们放在我的租户模型中,一切都很好。

最新更新