有一个ActiveRecord模型被认为是最佳做法,根据分配的值,它会生成单独模型的实例?我担心我的模型对彼此了解太多,并且正在变得难以编写测试,并且正在寻找正确的“Rails方式”来解决这个问题。
本质上,第一个模型是一个规范,它确定实例的数量和分配给另一个模型的那些实例的属性。我希望能够自由地更改该规范或个别实例。
我正在为我的公司创建一个预算编制应用程序。我们的想法是将现金流量跟踪为我的Transaction
模型所代表的一系列交易。
我不希望用户必须手动输入每个事务(但我希望他们能够在以后需要时编辑每个事务),因此我创建了CashRevenue
和CashExpense
模型,用户可以输入诸如开始日期,结束日期和增长率之类的内容,这些内容会持久存储到数据库,然后触发处理信息的非ActiveRecord模型TransactionBuilder
并调用Transaction.new()
正确的数字时间并正确设置属性。
为了实现这一点,我有CashRevenue
和CashExpense
调用TransactionBuilder.build_transactions(self)
来分配实例变量,调用方法来删除与调用对象关联的任何现有事务(如果它是更新的话)动作)。
由于收入交易在应用程序中的处理方式与费用不同,因此我在创建之前通过@cashflow_type = cashflow_item.class.to_s
检查类型。
然后按如下方式创建交易:
def self.add_transactions
number_of_occurences.times do
add_transaction
end
end
def self.add_transaction
transaction = Transaction.new()
if @cashflow_type == "CashExpense"
transaction.cash_expense_id = @cashflow_item.id
else
transaction.revenue_id = @cashflow_item.id
transaction.planned_number_of_customers = get_number_of_customers
transaction.planned_arpu_amount = get_arpu_amount
end
transaction.planned_amount = get_transaction_amount
transaction.planned_date = get_transaction_date
transaction.edit_method = "SYSTEM"
transaction.user_id = @cashflow_item.user_id
if transaction.save!
@last_transaction = transaction
end
是否有更好的方法来构建我的应用程序以实现相同的任务,同时使我的模型不那么紧密耦合?我期望这个应用程序在复杂性方面快速增长,所以希望尽可能保持模块化。
我的应用程序模型的铁路图:https://github.com/jamesconnolly93/investablemvp/blob/master/doc/models_brief.svg
非常感谢任何帮助!