现在有个 model 有超过 10 个 has_many(之后还有更多……),密密麻麻的,看着都晕。这种问题有什么靠谱的解决方法么?
user model 吗?
我认为这种种情况是常见的,关键是你的业务逻辑映射程模型关系是不是就是如此?如果是的话,那么这么处理没有错,否则的话就不符合一般 Rails 实现种的 common sense 了。
#1 楼 @clc3123 不是 user,是业务核心的一个 model.
#2 楼 @lgn21st 这样这个 model 会变得非常庞大(指代码量),有没有什么方法可以把这些关系抽象出去呢……
#4 楼 @iwinux 听起来不像是一个 Rails 的问题... 而是一个 models 设计的问题... 如果设计已定,该有 10 个 has_many 就应该有 10 个...
我觉得单从 rails 的 model 上没什么改进空间...不过设计上看有没有办法改进..从而 model 就能改进了 ...
这个得让 DBA 或业务人员重新考虑一下
#4 楼 @iwinux 你的问题我认为应该是“有没有什么办法可以把业务逻辑拆分程很多的子模块相互合的方式实现,从而可以将代码拆分出去,以防止单一 model 过度肥胖”,如果是这个问题的话,答案是可以,而且方式很多,不过一两句话说不清楚,简单的说 ruby 世界种的各种 gems 大多是为了解决这个问题。
我有个项目也是这种状况,主要业务的 Model 里面一大堆代码
#4 楼 @iwinux 将一些 has many 拆出成为扩展模型;将部分业务功能拆成 module;根据使用者类型的不同将业务分开(比如前端模型和后台管理模型)...... 总之这首先是业务问题,不是技术问题
#6 楼 @azhao 所以我正在考虑(咳咳)……
#7 楼 @lgn21st 把代码写到子模块里然后 include 进来?这个方法感觉不错。刚刚还想到,对于同一类型(比如多对多)的多个关联,可以通过命名约定 + meta programming 的方式简化代码(正在试验中)
#8 楼 @huacnlee 拿出来大家 review 一下?
extract model codes into Module... 具体方法可以看 ihower 的 ppt
我暂时就想到
user.read_topic(topic) => topic.read_by(user)
这样的处理。has_many 一个宏不占什么位置吧。