gpt4 book ai didi

ruby-on-rails - 为了瘦 Controller ,Rails 模型是否应该关注其他模型?

转载 作者:数据小太阳 更新时间:2023-10-29 07:14:05 27 4
gpt4 key购买 nike

我到处都读到业务逻辑属于模型而不属于 Controller ,但限制在哪里?我正在玩一个个人会计应用程序。

Account
Entry
Operation

创建操作时,仅当创建相应的条目并将其链接到帐户时才有效,以便平衡操作,例如购买 6 件装:

o=Operation.new({:description=>"b33r", :user=>current_user, :date=>"2008/09/15"})
o.entries.build({:account_id=>1, :amount=>15})
o.valid? #=>false
o.entries.build({:account_id=>2, :amount=>-15})
o.valid? #=>true

现在在基本操作情况下向用户显示的表单被简化为隐藏条目详细信息,帐户根据用户请求的操作类型从 5 个默认值中选择(初始化账户 -> 账户权益,花费 Assets -> 费用,赚取收入 -> Assets ,借入负债 -> Assets ,支付债务 Assets -> 负债 ...)我想要从默认值创建的条目。

我还希望能够创建更复杂的操作(超过 2 个条目)。对于第二个用例,我将采用不同的形式,其中会暴露额外的复杂性。第二个用例阻止我在操作中包含借方和贷方字段并删除输入链接。

哪种形式最好?像我目前所做的那样在 SimpleOperationController 中使用上面的代码,或者在 Operation 类上定义一个新方法以便我可以调用 Operation.new_simple_operation(params[:operation])

从 Operation 类实际创建和操作 Entry 对象不是打破了关注点分离吗?

我不是在寻求关于我扭曲的会计原则的建议:)

edit -- 看来我没有表达太清楚。我不太关心验证。我更关心创建逻辑代码应该去哪里:

假设 Controller 上的操作称为支出,当使用支出时,参数哈希将包含:金额、日期、描述。借方和贷方帐户将从调用的操作中派生,但我必须创建所有对象。拥有会不会更好

#error and transaction handling is left out for the sake of clarity
def spend
amount=params[:operation].delete(:amount)#remove non existent Operation attribute
op=Operation.new(params[:operation])
#select accounts in some way
...
#build entries
op.entries.build(...)
op.entries.build(...)
op.save
end

或者在 Operation 上创建一个方法,使上面看起来像

def spend
op=Operation.new_simple_operation(params)
op.save
end

这肯定会提供一个更薄的 Controller 和一个更胖的模型,但是模型将创建和存储其他模型的实例,这就是我的问题所在。

最佳答案

but then the model will create and store instances of other models which is where my problem is.

这有什么问题吗?

如果您的“业务逻辑”声明操作必须具有一组有效的条目,那么操作类了解和处理您的条目对象肯定没有错。

如果你走得太远,你只会遇到问题,让你的模型操纵它们不需要知道的东西,比如 EntryHtmlFormBuilder 或其他什么:-)

关于ruby-on-rails - 为了瘦 Controller ,Rails 模型是否应该关注其他模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com