Rails 实现多对多自连接
2016-03-21 15:26
549 查看
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的关联,不考虑业务需求,欢迎指正。
相关文章推荐
- Dell R420 RAID建立以及系统安装
- 使用AIDE做Linux高级入侵检测文件监控
- error LNK2019: 无法解析的外部符号 _main,该符号在函数___tmainCRTStartup 中被引用
- Check/Repair Geometry
- [leetcode] 217. Contains Duplicate
- 【AI】蒙特卡洛搜索树
- [LeetCode][数论]Contains Duplicate
- AIDL的使用
- [置顶] 人工智能实战——人工神经网络(C库iOS交叉编译)
- The working copy "" failed to commit files
- 利用遗传算法求解车辆路径问题
- Infopath——在给form的email地址添加链接打开Outlook
- WaitForTargetFPS和Gfx.WaitForPresent和Graphics.PresentAndSync
- Jenkins进阶系列之——02email-ext邮件通知模板
- Jenkins进阶系列之——01使用email-ext替换Jenkins的默认邮件通知
- 百度地图检索周围小吃添加大头针
- Foxmail 自动备份邮件,自动转发到另外一个邮箱的操作。
- 创建一个中国象棋的阿法狗——阿法象(0)
- Failed to initialize Monitor Thread: Unable to establish loopback connection的错误解决方案
- 503 Service Unavailable是怎么回事