这段时间一直在开发项目的后台部分。采用的方法是一个类一个类的设计,这样带来很大的一个问题,以后设计一定要分两步走,概要设计和细节设计,在概要设计里面,对核心流程设计的类都要先考虑。
我先设计Store类,每个用户在一个订单中会有一个快递速度的评分StoreOntimeScore.两者是一对多关系。但其实每次评分是关联到一个订单Order的。所以我的设计是Order has_one StoreOntimeScore.Store has_many Orders.Store has_many StoreOntimeScores through order.这个地方发现rails的一个bug.has_many不能through has_one,因为前几天也被这个家伙的一个bug搞死了,于是对他很是失望,之后就变成了对自己失望。
花了些时间来考虑怎么处理这个bug.
1.把has_one改为has_many,has_one也是一种特殊的has_many。代码改动很小,但逻辑上感觉总是那么不舒服。
2.不用through,在StoreOntimeScore直接加一个store_id,问题是冗余了,有可能不一致出错,并且也多了维护的代码。这个时候想到用元编程来解决这个问题。思路是在调用store_ontime_score.order=order,然程序自动设置store_ontime_score.store =store_ontime_score.order.store.于是有了下面需要extend进类的模块。
Module MyLib
def attr_related(origin,related)
define_method :"#{origin}=_with_sophie_0923_related" do |param|
self.send(:"#{origin}=_without_sophie_0923_related",param)
self.send(:"#{related}=",self.send(origin).send(related))
end
alias_method_chain :"#{origin}=",:sophie_0923_related
end
end
不得不说,这招虽然之后发现对我没有,但还是蛮强大的。不是到build方法是怎么实现的如果没有调用store=,build可能也要重写一些,不用build就不用。
因为这个是时候还没有考虑具体订单Order对象。当我开始设计具体的订单对象的时候发现,这个评分可以直接只是store的一个属性,于是开始疯狂删代码,删表ing...
这件事给我的教训:
1.慎用has_one,这个本来就是一一对应关系,数学上说,一一对应本来就可以看作是一个对象。如果真的要用has_one,我上面的代码和想法还是很不错的。这可能也是rails一直没有修复这个bug的原因
2.设计一定要分两部。
分享到:
相关推荐
考虑对象关联关系的多样化商品推荐方法
NULL 博文链接:https://dreamzhong.iteye.com/blog/1205496
针对社会化商品推荐中推荐对象背景数据单一、推荐结果缺乏多样性等问题,提出了一种基于推荐对象间关联关系的多样性推荐算法。在领域本体建模的基础上,将推荐对象之间的关联分为三类,即互补关联、相似关联和情景...
针对hibernate中关于对象间的关联关系的配置
简单的关联关系的小例子: OneToOne: Person.java: package model; import javax.persistence.*; @Entity public class person { //标识属性 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private...
python 对象之间的关联关系 示例
3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3....
父表中的外键,是子表中的主键。在父表中的外键,可以出现多次。主键是不能有重复的。
基于企业知识图谱的企业关联关系挖掘.docx
hibernate的关联关系映射,所有描述以选课系统这个案例来说明
关于面向对象的依赖、关联、聚合、组合关系
Hibernate映射一对多关联关系
详细讲解hibernate的关联关系,以及用实例讲解,非常详细
VC++ 画图 源码 STL 链表 类 对象 关联 可以直接用来进行开发 领悟GDI 必备
activiti表结构.doc,activiti5.22.pdb,activiti5.22.pdm
五项说明关联关系PPT素材下载。
hibernate实现多对多关联关系源码
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...
介绍使用Hibernate注解来进行关联关系的配置,结合我的博客文章阅读更方便理解。
关联关系按条件查询细,在开发中常常会遇到,里面有几点常见的,已经解决方法