Rails 实现多对多自连接
1. 先生成关联代码
class WorkConnect < ActiveRecord::Base
belongs_to :working, class_name: "Company"
belongs_to :worked, class_name: "Company"
end class Company < ActiveRecord::Base
#working表示我合作的公司,worked表示跟我合作的公司
has_many :working_c, class_name: "WorkConnect", foreign_key: :worked_id
has_many :worked_c, class_name: "WorkConnect", foreign_key: :working_id
has_many :working, class_name: "Company", through: :working_c
has_many :worked, class_name: "Company", through: :worked_c
end
2. 创建WorkConnect中两个字段
class CreateWorkConnect < ActiveRecord::Migration
def change
create_table :work_connects do |t|
t.integer :worked_id
t.integer :working_id
end
end
end
3. 然后进入console,调试,可以创建成功。
2.3.0 :003 > c1 = Company.find(2)
Company Load (0.2ms) SELECT `companies`.* FROM `companies` WHERE `companies`.`id` = 2 LIMIT 1
=> #<Company id: 2, name: "Eastcompeace", created_at: "2016-03-21 04:50:28", updated_at: "2016-03-21 04:50:28", work_id: nil>
2.3.0 :004 > c2 = Company.find(5)
Company Load (0.2ms) SELECT `companies`.* FROM `companies` WHERE `companies`.`id` = 5 LIMIT 1
=> #<Company id: 5, name: "360", created_at: "2016-03-21 06:53:37", updated_at: "2016-03-21 06:53:37", work_id: nil>
2.3.0 :005 > c1.working
Company Load (0.4ms) SELECT `companies`.* FROM `companies` INNER JOIN `works` ON `companies`.`id` = `works`.`working_id` WHERE `works`.`worked_id` = 2
=> #<ActiveRecord::Associations::CollectionProxy []>
2.3.0 :006 > c1.working << c2
(0.2ms) BEGIN
SQL (0.3ms) INSERT INTO `works` (`worked_id`, `working_id`) VALUES (2, 5)
(67.9ms) COMMIT
=> #<ActiveRecord::Associations::CollectionProxy [#<Company id: 5, name: "360", created_at: "2016-03-21 06:53:37", updated_at: "2016-03-21 06:53:37", work_id: nil>]>
2.3.0 :007 > c1.worked
Company Load (0.5ms) SELECT `companies`.* FROM `companies` INNER JOIN `works` ON `companies`.`id` = `works`.`worked_id` WHERE `works`.`working_id` = 2
=> #<ActiveRecord::Associations::CollectionProxy []>
2.3.0 :008 > c1.working
=> #<ActiveRecord::Associations::CollectionProxy [#<Company id: 5, name: "360", created_at: "2016-03-21 06:53:37", updated_at: "2016-03-21 06:53:37", work_id: nil>]>
2.3.0 :009 > c1.save
(0.2ms) BEGIN
(0.1ms) COMMIT
=> true
2.3.0 :010 > c2.worke
NoMethodError: undefined method `worke' for #<Company:0x00000003c33e00>
2.3.0 :011 > c2.worked
Company Load (0.5ms) SELECT `companies`.* FROM `companies` INNER JOIN `works` ON `companies`.`id` = `works`.`worked_id` WHERE `works`.`working_id` = 5
=> #<ActiveRecord::Associations::CollectionProxy [#<Company id: 3, name: "tengxun", created_at: "2016-03-21 05:56:22", updated_at: "2016-03-21 05:56:22", work_id: nil>, #<Company id: 2, name: "Eastcompeace", created_at: "2016-03-21 04:50:28", updated_at: "2016-03-21 04:50:28", work_id: nil>]>
2.3.0 :012 > c2.working
Company Load (0.4ms) SELECT `companies`.* FROM `companies` INNER JOIN `works` ON `companies`.`id` = `works`.`working_id` WHERE `works`.`worked_id` = 5
=> #<ActiveRecord::Associations::CollectionProxy []>
该例子纯属练习理解Model的关联,不考虑业务需求,欢迎指正。
Rails 实现多对多自连接的更多相关文章
- The Six Types of Rails Association
翻译整理自:http://guides.rubyonrails.org/v3.2.13/association_basics.html 想吐槽一句,http://guides.ruby-china.o ...
- Mybatis【一对多、多对一、多对多】知识要点
Mybatis[多表连接] 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联 ...
- SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.
SQL is a standard language for storing, manipulating and retrieving data in databases. 关系型数据库:RDBMS( ...
- Rails中的增删改查
1. rails中类与对象与SQL中表与行的关系 rails中提供了对象关系映射(ORM),将模型类映射至表,模型类的关联表名是类名小写后的复数形式,如类名Order,对应的表名为o ...
- 《Ruby on Rails教程》学习笔记
本文是我在阅读 Ruby on Rails 教程的简体中文版时所做的摘录,以及学习时寻找的补充知识.补充知识主要来自于 Ruby on Rails 實戰聖經. Asset Pipeline 在最新版 ...
- Ruby on Rails 路由解析
为了更好的阅读体验.欢迎訪问 作者博客原文 Route是什么 Rails中URL的约定严格基于RESTful风格的.client的请求事实上是在操作一些资源.同一资源的不同的请求动作(GET, POS ...
- mysql自连接?
一.自连接 /* 自己查询自己 把一张表看成是两张表. 表的设计. */ SELECT * from depart; -- 具体的查询方法,查询 name ,并给添加别名. select d1.nam ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
随机推荐
- Centos7的firewalld配置
红帽官方的使用文档: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Gu ...
- SqlMetal.exe ORM代码生成
作甚? 先说说这个工具是干啥的,我们所做的程序,或多或少需要存储一些数据到数据库,当然直接使用Sql语句也可以,甚至有些情况下就是要使用sql语句,但对于一些基本的增删改查,对每张表都要写查询语句就显 ...
- 自定义ViewGroup初步探究
由于项目需要,实现类似于地图控件,能够让一张图标自由缩放并且在其上固定位置,标记一些地点,所以在这里,我考虑了一下,决定使用自定义ViewGroup来实现.
- 【BZOJ 4561】【JLOI 2016】圆的异或并
http://www.lydsy.com/JudgeOnline/problem.php?id=4561 一开始并不会做,后来看题解看懂了. 看懂了之后还是错了好几次,数组大小手残开小了. 圆的包含并 ...
- spring-poi-excle往单元格写入图片
HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现 XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现 在POI中有HSSFPat ...
- Servlet和JSP学习指导与实践(一):Servlet API初探
前言: JavaSE如何跨度到JavaEE?原本java语言只是专门用于application桌面小应用程序的开发,但自从其追随CGI进入服务器端的开发之后便一发不可收拾.先是Servlet1.0,再 ...
- Linux文件计数
1.当前目录下的文件数 ls -l |grep "^-"|wc -l 2.当前目录的目录树 ls -l |grep "^d"|wc -l 3.当前目录文件数包含 ...
- oneuijs/You-Dont-Need-jQuery
oneuijs/You-Dont-Need-jQuery https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh- ...
- codevs 2021 中庸之道
2021 中庸之道 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定一个长度为N的序列,有Q次询问,每次 ...
- Publishing failed with multiple errors 异常
Publishing failed with multiple errors 在使用eclipse发布项目时不能自动生成class文件,且无法启动调试的Tomcat服务.启动过程提示 以上 异常 解决 ...