gpt4 book ai didi

ruby-on-rails - rails : too many methods in model

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

TL;DR:我不知道如何组织我的逻辑域类。

我有模型“应用程序”,这个模型是应用程序的“核心”,是我“进入”和操作其他模型的方式,例如:

@application = Application.find(params[:application_id])
@application.payment.update_attribute 'active', true

   unless @application.report.status 

   @application.set_income(params[:income][:new_income])

所以模型 Payment、Income 和 Report 基本上是空的,因为我初始化了 Application 模型,然后我从那里“级联”做一些事情来改变“从属”模型。但是现在 Application 模型有 40 多个方法和 600 行代码。

我做的对吗?例如,当我想添加一个新的付款时,我喜欢这样做:

payment = Payment.create params  

在应用程序模型中,因为 ActiveRecord“知道”如何自动处理外键。我可以使用以下方法在支付模型中创建支付:

application = Application.find(application_id)
params[:application_id] = application.id
self.create params

但这样,我需要手动设置 Application.id,这看起来更冗长且不优雅。

那么——如果我想减少我的应用程序模型——我应该在 APP/lib 目录中创建模块还是应该将方法移动到其他模型?

最佳答案

should I create modules in APP/lib directory

基本上,是的,这就是您应该做的。尽管我可能会将它们设为类而不是模块。听起来您所追求的模式称为“服务对象”(或有时称为“用例”)。它所做的是从您要执行的特定操作中获取逻辑,并将其放入它自己的独立类中。然后该类与它需要的任何模型进行协作。因此,您的模型保持很小,并且您的“服务类”遵循单一职责原则。然后,您的 Controller 通常会调用一个“服务类”来完成它们需要做的事情——因此您的 Controller 也保持在非常小的水平。

如果你用谷歌搜索“rails service objects”或类似的东西,你会发现很多很棒的东西,但这里有一些资源可以帮助你入门。

服务对象 rails casts:https://www.youtube.com/watch?v=uIp6N89PH-c

https://webuild.envato.com/blog/a-case-for-use-cases/

https://blog.engineyard.com/2014/keeping-your-rails-controllers-dry-with-services

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/ (那里有一节是关于服务对象的)

请记住,一旦您开始使用服务对象,就不必总是检查 Application模型去相关的。服务对象可能需要 application_id然后做例如。 @payment = Payment.find_by(application_id: application_id)所以你根本不需要获取应用程序实例并且可以操作 @payment直接变量。

Rails 使访问相关模型变得“简单”和“漂亮”这一事实并不一定意味着您应该这样做。

关于ruby-on-rails - rails : too many methods in model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41581180/

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