ruby-on-rails – 使用includes语句,Rails 4 has_and_belongs_to_many无法正常工作

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 使用includes语句,Rails 4 has_and_belongs_to_many无法正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近我遇到了rails 4和HABTM关系的神秘错误.
首先是我的Gemfile:
  1. source 'https://rubygems.org'
  2. gem 'rails','~> 4.1.6'
  3. gem 'pg'

下一个.我的模特:

  1. class User < ActiveRecord::Base
  2. end
  3.  
  4. class Teacher < User
  5. has_and_belongs_to_many :resources,foreign_key: :user_id
  6. end
  7.  
  8. class Resource < ActiveRecord::Base
  9. has_and_belongs_to_many :teachers,association_foreign_key: :user_id
  10. end

原始数据库数据:

  1. select * from resources;
  2. id | created_at | updated_at
  3. ----+----------------------------+----------------------------
  4. 1 | 2014-10-13 08:24:07.308361 | 2014-10-13 08:24:07.308361
  5. 2 | 2014-10-13 08:24:07.889907 | 2014-10-13 08:24:08.156898
  6. 3 | 2014-10-13 08:24:08.68579 | 2014-10-13 08:24:08.884731
  7. 4 | 2014-10-13 08:24:09.997244 | 2014-10-13 08:24:10.205753
  8. (4 rows)
  9.  
  10. select * from users;
  11. id | created_at | updated_at | type
  12. ----+----------------------------+----------------------------+---------
  13. 13 | 2014-10-13 08:24:01.086192 | 2014-10-13 08:24:01.086192 | Teacher
  14. 12 | 2014-10-13 08:24:00.984957 | 2014-10-13 08:24:00.984957 | Teacher
  15. 2 | 2014-10-13 08:23:59.950349 | 2014-10-16 08:46:02.531245 | Teacher
  16. (3 rows)
  17.  
  18. select * from resources_users;
  19. user_id | resource_id
  20. ---------+-------------
  21. 13 | 1
  22. 2 | 2
  23. 12 | 3
  24. 2 | 4
  25. (4 rows)

最后这个bug:

  1. rails_test bundle exec rails c
  2. Loading development environment (Rails 4.1.6)
  3. 2.1.2 :001 > Resource.all.includes(:teachers).map(&:teachers).map(&:to_a)
  4. Resource Load (0.6ms) SELECT "resources".* FROM "resources"
  5. sql (1.3ms) SELECT "resources_users".*,"resources_users"."user_id" AS t0_r0,"resources_users"."resource_id" AS t0_r1,"users"."id" AS t1_r0,"users"."created_at" AS t1_r1,"users"."updated_at" AS t1_r2,"users"."type" AS t1_r3 FROM "resources_users" LEFT OUTER JOIN "users" ON "users"."id" = "resources_users"."user_id" AND "users"."type" IN ('Teacher') WHERE "users"."type" IN ('Teacher') AND "resources_users"."resource_id" IN (1,2,3,4)
  6. => [
  7. [#<Teacher id: 13,created_at: "2014-10-13 08:24:01",updated_at: "2014-10-13 08:24:01",type: "Teacher">],[],[]]

正如您所看到的,只有第一批教师返回收藏中.但是Rails生成sql是正确的并返回所有数据:

  1. SELECT "resources_users".*,4);
  2. user_id | resource_id | t0_r0 | t0_r1 | t1_r0 | t1_r1 | t1_r2 | t1_r3
  3. ---------+-------------+-------+-------+-------+----------------------------+----------------------------+---------
  4. 13 | 1 | 13 | 1 | 13 | 2014-10-13 08:24:01.086192 | 2014-10-13 08:24:01.086192 | Teacher
  5. 2 | 2 | 2 | 2 | 2 | 2014-10-13 08:23:59.950349 | 2014-10-16 08:46:02.531245 | Teacher
  6. 12 | 3 | 12 | 3 | 12 | 2014-10-13 08:24:00.984957 | 2014-10-13 08:24:00.984957 | Teacher
  7. 2 | 4 | 2 | 4 | 2 | 2014-10-13 08:23:59.950349 | 2014-10-16 08:46:02.531245 | Teacher
  8. (4 rows)

以前有人遇到过这样的问题吗?我无法理解这里发生了什么.

附:如果你做Resource.all.includes(:教师).map {| r | r.reload.teachers}结果是正确的.然而,它从包含中删除了感觉并提供了N 1问题.

更新:还有一个值得一提的发现.如果我删除STI一切正常.

解决方法

我用pg gem在Rails 4.1.6中重新创建了那些ActiveRecord模型和数据库记录,并看到了正确的行为:

IRB(主):017:0> Resource.all.includes(:教师).MAP(安培;:教师).MAP(安培;:to_a)资源负载(0.6ms)选择“资源”.* FROM“资源”sql(6.9ms)SELECT“resources_users”.*,“resources_users”.“id”AS t0_r0,“resources_users”.“resource_id”AS t0_r1,“resources_users”.“user_id”AS t0_r2,“users”.“id”AS t1_r0,“users”.“type”AS t1_r1,“users”.“created_at”AS t1_r2,“users”.“updated_at”AS t1_r3 FROM“resources_users”LEFT OUTER JOIN“users”ON“users”.“id”= “resources_users”.“user_id”和“users”.“type”IN(‘Teacher’)WHERE“users”.“type”IN(‘Teacher’)AND“resources_users”.“resource_id”IN(1,4)=> [[#<老师ID:13,输入:“老师”,created_at:“2015-11-05 07:02:59”,updated_at:“2015-11-05 07:02:59”>],[ #<教师ID:2,输入:“Teacher”,created_at:“2015-11-05 07:02:20”,updated_at:“2015-11-05 07:02:32”>],[#&lt ;教师ID:12,created_at:“2015-11-05 07:03:50”,updated_at:“2015-11-05 07:03:50”>],[#<老师id:2,updated_at:“2015-11-05 07:02:32”>]]

猜你在找的Ruby相关文章