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 实现多对多自连接的更多相关文章

  1. The Six Types of Rails Association

    翻译整理自:http://guides.rubyonrails.org/v3.2.13/association_basics.html 想吐槽一句,http://guides.ruby-china.o ...

  2. Mybatis【一对多、多对一、多对多】知识要点

    Mybatis[多表连接] 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联 ...

  3. SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.

    SQL is a standard language for storing, manipulating and retrieving data in databases. 关系型数据库:RDBMS( ...

  4. Rails中的增删改查

      1.        rails中类与对象与SQL中表与行的关系 rails中提供了对象关系映射(ORM),将模型类映射至表,模型类的关联表名是类名小写后的复数形式,如类名Order,对应的表名为o ...

  5. 《Ruby on Rails教程》学习笔记

    本文是我在阅读 Ruby on Rails 教程的简体中文版时所做的摘录,以及学习时寻找的补充知识.补充知识主要来自于 Ruby on Rails 實戰聖經. Asset Pipeline 在最新版 ...

  6. Ruby on Rails 路由解析

    为了更好的阅读体验.欢迎訪问 作者博客原文 Route是什么 Rails中URL的约定严格基于RESTful风格的.client的请求事实上是在操作一些资源.同一资源的不同的请求动作(GET, POS ...

  7. mysql自连接?

    一.自连接 /* 自己查询自己 把一张表看成是两张表. 表的设计. */ SELECT * from depart; -- 具体的查询方法,查询 name ,并给添加别名. select d1.nam ...

  8. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  9. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. LinkedIn的即时消息:在一台机器上支持几十万条长连接

    最近我们介绍了LinkedIn的即时通信,最后提到了分型指标和读回复.为了实现这些功能,我们需要有办法通过长连接来把数据从服务器端推送到手机或网页客户端,而不是许多当代应用所采取的标准的请求-响应模式 ...

  2. BIOS设置和CMOS设置的区别与联系

    BIOS是主板上的一块EPROM或EEPROM芯片,里面装有系统的重要信息和设置系统参数的设置程序(BIOS Setup程序): CMOS是主板上的一块可读写的RAM 芯片,里面装的是关于系统配置的具 ...

  3. 用于制作app store的截图的工具:Brief Wrapper —— 最便捷的应用商店屏幕快照

    https://itunes.apple.com/cn/app/brief-wrapper-zui-bian-jie/id991730319?l=en&mt=8 可以快捷的做出类似于下面的这种 ...

  4. [CareerCup] 2.5 Add Two Numbers 两个数字相加

    2.5 You have two numbers represented by a linked list, where each node contains a single digit. The ...

  5. Windows Live Writer 2012 on .net 4

    众所周知,强大的live套件不再更新,止步于2012,所以安装的时候需要.net 3.5的运行时,这很讨厌,在新系统里面是.net 4运行时的,.net运行时的设计者脑袋张虫,新的居然不默认支持旧的程 ...

  6. 恢复 Windows 7 的“回到父目录”按钮

    Windows 7 使用以来很多方面一直不习惯,特别是让我无比纠结的”回到父目录“ 按钮从资源管理器中消失了. 不能不说这是一个失败! 很多时候,Win 7 地址栏中自以为是的显示的很多层目录层次的面 ...

  7. 85 megacli-查看raid信息

    文章本身我不做过多修改了,在这里我就把自己在安装时候碰到的难点跟大家提下.1.何处下载?首先,根据文章中的路径已经下载不到相应的文件了,在此我们就自己到http://www.lsi.com的网站上去搜 ...

  8. sqlserver 游标

    DECLARE ChangeInvCodeCursor CURSOR FOR SELECT A.name AS tablecolumn,C.name AS tablename FROM sys.col ...

  9. Linux 内核数据结构:双向链表

    Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...

  10. iOS - 适配器模式场景总结

    适配器模式: 1.出现场景 TableViewCell视图层 - 输出 无论NSData怎么变化,数据都可以显示在视图层中. 2.组成结构 输入 - [适配器]- 输出 (数据层) - [适配器]- ...