`
zizipo
  • 浏览: 23288 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于对象关联关系的一点感悟

阅读更多
这段时间一直在开发项目的后台部分。采用的方法是一个类一个类的设计,这样带来很大的一个问题,以后设计一定要分两步走,概要设计和细节设计,在概要设计里面,对核心流程设计的类都要先考虑。
我先设计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.设计一定要分两部。
2
0
分享到:
评论

相关推荐

    考虑对象关联关系的多样化商品推荐方法

    考虑对象关联关系的多样化商品推荐方法

    数据表的关联关系图-父表与子表的关联关系

    在数据库设计中,数据表之间的关联关系是至关重要的,它定义了不同表之间的逻辑联系,使得数据能够有效地组织和查询。本话题主要讨论的是“数据表的关联关系图”,特别是父表与子表的关联关系,涉及到的核心概念包括...

    hibernate的关联关系映射

    【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...

    hibernate关联关系实例

    以上就是关于Hibernate关联关系和HQL的基本实例。在实际开发中,这些关联关系和查询方式可以帮助我们构建灵活、可扩展的数据模型,提升代码的可读性和可维护性。在使用时,要注意合理选择关联类型,避免冗余数据,并...

    Hibernate关联关系

    在实际应用中,对象之间的关联关系是非常常见的,而Hibernate同样提供了一套完善的解决方案来处理这些关系。本文将以“Hibernate关联关系”为主题,详细介绍Hibernate中关联关系的创建及使用方法。 #### 关联关系...

    论文研究-考虑对象关联关系的多样化商品推荐方法.pdf

    针对社会化商品推荐中推荐对象背景数据单一、推荐结果缺乏多样性等问题,提出了一种基于推荐对象间关联关系的多样性推荐算法。在领域本体建模的基础上,将推荐对象之间的关联分为三类,即互补关联、相似关联和情景...

    hibernate关联关系总结

    Hibernate关联关系是Java持久化框架Hibernate中的核心概念,它允许我们在数据库中建立对象之间的关系映射,以便在程序中操作对象时,可以自动处理与数据库的交互。本篇将深入探讨Hibernate的四种主要关联关系:一对...

    Hibernate 关联关系解除

    1. 设置关联字段为null:对于多对一和一对一关系,将引用对象设为null,Hibernate会在持久化时自动删除关联。 2. 使用CascadeType:通过设置CascadeType,可以在一个实体被删除或更新时,自动处理相关联的实体。例如...

    关联关系.doc

    简单的关联关系的小例子: OneToOne: Person.java: package model; import javax.persistence.*; @Entity public class person { //标识属性 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private...

    hibernate一对一关联关系

    以上就是关于Hibernate一对一关联关系的详细解释,通过理解和掌握这些知识点,你可以更有效地在Java项目中设计和实现数据库模型,提高代码的可读性和维护性。希望这份资源能帮助你更好地理解和运用Hibernate框架。

    python 对象之间的关联关系 示例

    python 对象之间的关联关系 示例

    3.java关联关系.zip

    3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3.java关联关系.zip3....

    MyBatis3关联关系

    在处理复杂的数据库关联关系时,MyBatis 提供了一对一、一对多、多对多等多种映射方式,使得数据模型的构建和数据查询变得更加灵活。 ### 一对一映射 1. **查询方式**:在 MyBatis 中,一对一映射可以通过圆点记法...

    基于注解的关联关系Hibernate

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为面向对象的方式,从而简化了数据访问层的实现。在这个“基于注解的关联关系Hibernate”的主题中,我们将深入探讨...

    hibernate各种常用关联关系的基本配置

    在Java的持久化框架Hibernate中,对象关系映射(ORM)是其核心功能之一,它允许开发者用面向对象的方式处理数据库操作。关联关系是ORM中关键的概念,它模拟了现实世界中的实体之间的联系。本篇文章将深入探讨...

    Hibernate映射一对多关联关系

    ### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...

    面向对象的依赖、关联、聚合、组合关系

    本文将深入探讨面向对象中的四种基本关系:依赖、关联、聚合和组合,以及它们在实际应用中的含义和用例。 ### 一、依赖(Dependency) 依赖是最弱的一种关系,表示一个类依赖于另一个类的接口或实现,但这种依赖通常...

    hibernate多对一单向关联关系实现源码

    以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...

    hibernate实现多对多关联关系源码

    通过阅读源码,可以更深入地理解Hibernate是如何处理多对多关联的,包括映射关系的配置、数据库交互以及关联对象的存取。 总之,理解并正确实现Hibernate的多对多关联关系对于开发高效、健壮的Java应用至关重要。...

Global site tag (gtag.js) - Google Analytics