我不喜欢 Rails 模型同时用于业务逻辑和持久性的想法。我很想将两者分开:让我的模型包含业务逻辑,并使用另一个类层次结构来持久化。
有没有人试过这个并获得任何牵引力?在我的脑海中,它似乎对 Rails 过于强烈:form_for 需要一个 ActiveModel 对象才能工作,许多直接在业务对象上工作的常见插件也是如此。
有什么想法吗?
我不喜欢 Rails 模型同时用于业务逻辑和持久性的想法。我很想将两者分开:让我的模型包含业务逻辑,并使用另一个类层次结构来持久化。
有没有人试过这个并获得任何牵引力?在我的脑海中,它似乎对 Rails 过于强烈:form_for 需要一个 ActiveModel 对象才能工作,许多直接在业务对象上工作的常见插件也是如此。
有什么想法吗?
我认为完全按照您的说法去做会很困难/很烦人,但是有一些很好的方法可以分离出您的代码。
正如您所说,一种方法是拥有 2 个单独的类,一个用于持久性,一个用于业务逻辑。我们称它们为 Foo 和 FooBL。Foo 将从 ActiveRecord 继承,包含验证逻辑以及一些用于查询和操作数据的简单方法。FooBL 将是一个常规的 ruby 类,它会根据需要使用 Foo 类。您甚至可以使用 Ruby 的一些委托功能,以便可以直接使用 Foo 的一些属性和方法。
另一种稍微不同的方法是使用 Presenters,就像在Draper gem 中一样。它没有将业务逻辑从持久性逻辑中分离出来,而是分离了与视图相关的逻辑。不完全是您正在寻找的东西,但它仍然有助于清理您的代码。
我还建议您看一看 Avdi Grimm 的书Object on Rails。他深入研究了其中一些模式和实践。
祝你好运!