Rails胖模型的例子,这是正确的思维方式吗?

时间:2011-05-08 09:59:45

标签: ruby-on-rails ruby model controller business-logic

如果我在数据库用户和用户信息中有两个表(分为规范化目的),我生成两个模型User,UserInfo并通过关系将它们用作正常。

后来我的应用程序部分读取和写入两者,但是,创建条目有相当多的业务逻辑,例如查找条件规则的其他表,字符串构建等。

制作第三个模型(非数据库支持的模型)来处理所有这些以及通过其他两个模型创建/保存是否有意义?或者我应该把它保存在控制器中?

另一个例子可能是导入一个CSV文件,其中所有数据在不同的表之间分开,这是应用程序其余部分使用的单独模型。我可以使用定义每一行的模型来处理通过其他模型保存导入的数据。或者这应该在控制器中吗?

我对开发大型轨道应用程序时的最佳实践感兴趣。

2 个答案:

答案 0 :(得分:2)

听起来你正常化(最小化冗余)而不是去规范化。

我不知道你的应用程序,所以请把它作为考虑而不是推荐的最佳实践:在这种情况下我通常喜欢做的是隐藏用户背后的Userinfo,以便用户是只有部分应用程序甚至知道有一个Userinfo。这可以使代码的其他客户端(控制器,其他模型以及在控制台中与它交互时)保持简单和一致,并且干燥。

引入第三个模型可能会起到同样的作用,但它也会给应用程序增加概念上的重量。

答案 1 :(得分:0)

答案取决于你首先将用户数据分成两个表的原因 - 它应该解决什么问题。想出来并尝试将相同的逻辑应用于模型。

无论如何,我同意创建第三个模型是有意义的,该模型封装了与其他两个一起工作的复杂性。这使您可以向应用程序的其他层(控制器,视图)提供更简单的界面。但是,你必须仔细观察你的目标。如果您发现自己通过委托对封装组件的调用来重新实现大部分ActiveRecord :: Base,那么可能需要重新考虑。

顺便说一句,你做的不是去标准化。在关系数据库的上下文中去标准化意味着创建冗余(检查Wikipedia article on normalization,反标准化是相反的)。这通常是为了通过减少所需的连接数来提高性能。