我已经在一个服务中实现了一个低级缓存。所以我需要在活动记录模型创建、更新或销毁时使其无效。起初,我在控制器端做了无效。它工作正常,但我的同事建议将其放在模型回调上,它仍然工作。所以我的问题是:1.可以在模型部分而不是控制器上使其无效吗?1.有什么缺点吗?预先感谢您的回答。编码愉快!)
6l7fqoea1#
可以在模型部分而不是控制器上使其无效吗?铁路警察不会来阻止你的。模型回调的优点是,理论上它们总是在你不动一根手指的情况下被触发,这就是它真正结束的地方。缺点是,除了模型的生命周期之外,他们根本不知道任何上下文,并且很容易以拙劣的解决方案来抑制回调。当有一个以上的模型参与到图片中时,模型回调也会失败。责任应该是模型A还是模型B?两者都是?两者都不是?还有一个问题是,你是否真的应该让你的模型承担另一个责任?在Rails中,模型已经在做持久化、数据库查询、类型转换、验证、序列化、与I18n交互、ActiveStorage、多态路由等。在其他框架中,你可以将这些任务分散到数据库存储库、表单对象等等。另一个经常被忽略的方面是,Rails应用程序中的所有内容实际上并不都属于M、V或C。如果您有一个需要封装的混乱/昂贵的查询,可以使用其他模式,如repository pattern。
1条答案
按热度按时间6l7fqoea1#
可以在模型部分而不是控制器上使其无效吗?
铁路警察不会来阻止你的。
模型回调的优点是,理论上它们总是在你不动一根手指的情况下被触发,这就是它真正结束的地方。
缺点是,除了模型的生命周期之外,他们根本不知道任何上下文,并且很容易以拙劣的解决方案来抑制回调。
当有一个以上的模型参与到图片中时,模型回调也会失败。责任应该是模型A还是模型B?两者都是?两者都不是?
还有一个问题是,你是否真的应该让你的模型承担另一个责任?在Rails中,模型已经在做持久化、数据库查询、类型转换、验证、序列化、与I18n交互、ActiveStorage、多态路由等。在其他框架中,你可以将这些任务分散到数据库存储库、表单对象等等。
另一个经常被忽略的方面是,Rails应用程序中的所有内容实际上并不都属于M、V或C。如果您有一个需要封装的混乱/昂贵的查询,可以使用其他模式,如repository pattern。