0 0

一个有点复杂的多对多映射5

大致模型结构是这样:用户(多对多)部门(多对多)部门经理。因为经理也是用户,所以数据库表是这样:

  • 用户(User)
  • 部门(Department)
  • 部门经理(User)
  • 用户|部门关联(DepartmentUser)
  • 部门|部门经理关联(DepartmentManager)

 

我想实现的是:查找用户A所在所有部门的经理们

 

我自己也摸索了一下,各种多对多的模型已经弄好,如下:

user.rb

class User < ActiveRecord::Base
  #作为用户所属的部门们
  has_many :departments_users
  has_many :departments, :through => :departments_users

  #作为经理掌管的部门们
  has_many :departments_managers
  has_many :directs, :through => :departments_managers, :source => :department
end
 

department.rb

class Department < ActiveRecord::Base
  #部门的用户们
  has_many :departments_users
  has_many :users, :through => :departments_users

  #部门的经理们
  has_many :departments_managers
  has_many :managers, :through => :departments_managers, :source => :user
end

 

departments_manager.rb

class DepartmentsManager < ActiveRecord::Base
  belongs_to :department
  belongs_to :user
end

 departments_user.rb

class DepartmentsUser < ActiveRecord::Base
  belongs_to :department
  belongs_to :user
end

 然后我假定的数据是这样:



自己用类似User.find(1).departments之类的查询试了几个都无误。然后我想查“用户3所在的部门的经理们”,就出现了问题:

User.where("users.id = 3").joins(:departments => :managers).map{|p| p.id}
=> [3, 3, 3]

 我期望得到的是[1,3,5]才对。我怀疑是where条件里的users.id = 3写得不对,但这里不写users.id又写什么呢……


问题补充:图好像挂了,贴个地址:
http://i27.photobucket.com/albums/c177/hexawing/study/many_to_many_to_many.gif
2012年7月23日 15:13
  • 大小: 2.4 KB
目前还没有答案

相关推荐

    ibatis 一对多 多对多完整映射

    例如,用户和角色之间的关系可能是多对多,一个用户可以有多个角色,一个角色也可以被多个用户拥有。 1. **配置中间表** 在数据库层面,你需要创建一个中间表,如`user_role`,包含`user_id`和`role_id`字段。 2...

    MyBatis一对多映射

    一对多映射指的是一个父类实体对应多个子类实体的关系,例如一个学生可以有多个课程,一个部门可以有多名员工等。 一、一对多映射的基本概念 在数据库中,如果一个表的记录(主表)与另一个表的记录(从表)之间...

    一对多映射(双向映射)源码

    在Java或其他编程语言中,一对多映射(也称为多对一映射)和双向映射是两个重要的概念,它们在设计模式、数据库关系映射以及数据结构实现等方面有广泛应用。 一对多映射是指一个键可以对应多个值,而每个值只能对应...

    ibatis 一对多关系映射

    Ibatis,作为一个轻量级的Java ORM框架,提供了强大的功能来处理复杂的数据映射,其中包括一对多的关系映射。在这个场景下,我们将深入探讨Ibatis如何实现一对多的关系映射。 一对多关系在数据库设计中非常常见,它...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate关联映射详解SSH 多对多,一对多关系对象映射

    本篇文章将深入探讨Hibernate中的一对多和多对多关系映射。 首先,让我们理解一对多关联映射。在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这可以通过在实体类中...

    hibernate 映射关系学习入门 一对一映射

    一对一映射是Hibernate中的一种关联关系,它表示两个实体之间存在唯一的对应关系,如同一个人只有一个身份证,或者一个部门只有一个经理。这种映射关系在数据库设计中并不常见,但在特定场景下很有用。 ### 1. 一对...

    MyBatis高级映射(一对多查询)

    在数据库关系模型中,一对多关系是常见的关联类型,例如一个学生可以对应多个课程,一个部门可以有多个员工等。MyBatis提供了一对多映射功能,使得在Java对象中可以直接获取到这种关联关系的数据。 1. **配置一对多...

    hibernate 一对多多对一的映射

    多对一关系是另一个表的多行可以对应到同一个表的一行。在Hibernate中,实现多对一映射的方法与一对多类似,只是在实体类的定义上有所区别: 1. **配置文件映射**:同样需要在配置文件中声明两个实体类和它们的关联...

    实现Mybatis框架中一对多关联映射的查询操作。

    在处理复杂的数据库关联关系时,比如一对一、一对多、多对一、多对多等,Mybatis提供了灵活的映射机制。本篇将详细讲解如何在Mybatis中实现一对多关联映射的查询操作。 首先,我们要明确一对多关联映射的基本概念。...

    Hibernate使用 Map实现多对多映射

    在Java的持久化框架Hibernate中,多对多映射是一种常见的关系映射方式...综上所述,使用Hibernate的Map实现多对多映射是一种灵活且高效的方法,允许开发者以面向对象的方式处理复杂的数据关系,同时简化了数据库操作。

    MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    一对多关联映射是指一个实体可以对应多个实例,比如一个班级可以有多名学生。MyBatis中使用`&lt;collection&gt;`标签来配置这种关系。以`Class`和`Student`为例: 1. 在`Class`实体的Mapper XML文件中,添加`&lt;collection&gt;...

    多对多的关联映射--基于SSH开发

    本主题聚焦于SSH框架中的“多对多”关联映射,这是一种数据库设计模式,允许一个实体与多个其他实体相互关联。下面将深入探讨这一关键概念及其在SSH框架下的实现。 首先,让我们理解“多对多”关联。在关系数据库中...

    Hibernate之关联关系映射(一对多和多对一映射,多对多映射).docx

    `表示一个员工隶属于一个部门,这是多对一关系。在映射配置文件中,需要使用`@OneToMany`和`@ManyToOne`注解来指定这些关系。 2. 多对多映射: 对于多对多关系,如项目和开发人员的关联,一个项目可能有多个开发...

    Mybatis复杂映射开发开源架构源码2021.pdf

    复杂映射开发是Mybatis框架中的一个重要部分,它支持将单个结果集映射到复杂类型的嵌套结构中。 首先,Mybatis的复杂映射通过自定义映射规则来实现,如XML配置文件中可以定义多种映射类型和行为。在自定义映射中,`...

    MyBatis高级映射(多对多查询)

    对于多对多关系,可能需要嵌套的结果映射,即在一个对象内包含另一个对象的集合。 4. **自动填充关联对象**:MyBatis的`&lt;collection&gt;`标签允许你指定一个Java集合类型(如List或Set),并配置`&lt;foreach&gt;`来迭代中间...

    Mybtis级联映射(一对一,一对多)例子

    而一对多关系则是一个表的记录可以对应另一个表中的多个记录。 ### 1. 一对一映射 在Mybatis中,一对一映射通常通过`resultMap`来实现。我们可以定义一个`id`属性来指向另一个实体类的主键,然后在另一个实体类的`...

    一对一双向关联映射

    总的来说,一对一双向关联映射在Hibernate中是一个强大的工具,它允许我们在Java对象和数据库记录之间创建灵活的关系。通过理解和熟练掌握这种映射,开发者可以更高效地管理和操作数据库中的复杂关联数据。而测试...

    Springboot中mybatis表关联映射关系(一对一)

    在 Springboot 中,MyBatis 提供了强大的表关联映射关系机制,可以实现一对一、多对一、多对多等各种关联关系。在本文中,我们将详细介绍 Springboot 中 MyBatis 表关联映射关系的实现机制,特别是针对一对一关联...

Global site tag (gtag.js) - Google Analytics