- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我遇到了 Rails 4 和 HABTM 关系的神秘错误。首先是我的 Gemfile:
source 'https://rubygems.org'
gem 'rails', '~> 4.1.6'
gem 'pg'
下一步。我的模型:
class User < ActiveRecord::Base
end
class Teacher < User
has_and_belongs_to_many :resources, foreign_key: :user_id
end
class Resource < ActiveRecord::Base
has_and_belongs_to_many :teachers, association_foreign_key: :user_id
end
原始数据库数据:
select * from resources;
id | created_at | updated_at
----+----------------------------+----------------------------
1 | 2014-10-13 08:24:07.308361 | 2014-10-13 08:24:07.308361
2 | 2014-10-13 08:24:07.889907 | 2014-10-13 08:24:08.156898
3 | 2014-10-13 08:24:08.68579 | 2014-10-13 08:24:08.884731
4 | 2014-10-13 08:24:09.997244 | 2014-10-13 08:24:10.205753
(4 rows)
select * from users;
id | created_at | updated_at | type
----+----------------------------+----------------------------+---------
13 | 2014-10-13 08:24:01.086192 | 2014-10-13 08:24:01.086192 | Teacher
12 | 2014-10-13 08:24:00.984957 | 2014-10-13 08:24:00.984957 | Teacher
2 | 2014-10-13 08:23:59.950349 | 2014-10-16 08:46:02.531245 | Teacher
(3 rows)
select * from resources_users;
user_id | resource_id
---------+-------------
13 | 1
2 | 2
12 | 3
2 | 4
(4 rows)
最后是错误:
➜ rails_test bundle exec rails c
Loading development environment (Rails 4.1.6)
2.1.2 :001 > Resource.all.includes(:teachers).map(&:teachers).map(&:to_a)
Resource Load (0.6ms) SELECT "resources".* FROM "resources"
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)
=> [
[#<Teacher id: 13, created_at: "2014-10-13 08:24:01", updated_at: "2014-10-13 08:24:01", type: "Teacher">],
[],
[],
[]]
如您所见,集合中仅返回第一组教师。但是 Rails 生成的 SQL 是正确的并返回所有数据:
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);
user_id | resource_id | t0_r0 | t0_r1 | t1_r0 | t1_r1 | t1_r2 | t1_r3
---------+-------------+-------+-------+-------+----------------------------+----------------------------+---------
13 | 1 | 13 | 1 | 13 | 2014-10-13 08:24:01.086192 | 2014-10-13 08:24:01.086192 | Teacher
2 | 2 | 2 | 2 | 2 | 2014-10-13 08:23:59.950349 | 2014-10-16 08:46:02.531245 | Teacher
12 | 3 | 12 | 3 | 12 | 2014-10-13 08:24:00.984957 | 2014-10-13 08:24:00.984957 | Teacher
2 | 4 | 2 | 4 | 2 | 2014-10-13 08:23:59.950349 | 2014-10-16 08:46:02.531245 | Teacher
(4 rows)
有没有人遇到过这样的问题?我不明白这里发生了什么。
附言如果你这样做 Resource.all.includes(:teachers).map { |r| r.reload.teachers
结果正确。然而,它完全消除了 include
的意义,并提供了 N+1 问题。
更新:还有一个值得一提的发现。如果我删除 STI,一切正常。
最佳答案
我重新创建了那些 ActiveRecord
Rails 4.1.6 中的模型和数据库记录 pg
gem 并看到了正确的行为:
irb(main):017:0> Resource.all.includes(:teachers).map(&:teachers).map(&:to_a)
Resource Load (0.6ms) SELECT "resources".* FROM "resources"
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" AND "users"."type" IN ('Teacher') WHERE "users"."type" IN ('Teacher') AND "resources_users"."resource_id" IN (1, 2, 3, 4)
=> [[#<Teacher id: 13, type: "Teacher", created_at: "2015-11-05 07:02:59", updated_at: "2015-11-05 07:02:59">], [#<Teacher id: 2, type: "Teacher", created_at: "2015-11-05 07:02:20", updated_at: "2015-11-05 07:02:32">], [#<Teacher id: 12, type: "Teacher", created_at: "2015-11-05 07:03:50", updated_at: "2015-11-05 07:03:50">], [#<Teacher id: 2, type: "Teacher", created_at: "2015-11-05 07:02:20", updated_at: "2015-11-05 07:02:32">]]
关于ruby-on-rails - Rails 4 has_and_belongs_to_many 不能正常使用包含语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26507074/
我需要查找两个模型之间的记录。 class Report has_and_belongs_to_many :groups end class Group has_and_belongs_to_
我正在尝试在我的 Rails 应用程序中设置 Employee 模型和 NetworkDrive 模型之间的 has_and_belongs_to_many 关系。 在 employee.rb 中我指
我在用户和项目之间建立了多对多关系,而且它工作得很好。但是我想在 mongoid 中模拟这种情况: db.projects.insert( { "name" : "Test project
我有两个实体、数据中心和项目之间的多对多链接表,在遗留代码中。我发现,这实际上是一对多的关系。 作为清理关系的第一步,我想放一个唯一索引在其中一个字段上。 现在我收到以下错误: has_and_bel
我有一组非常简单的 HABTM 模型 class Tag tag) end end end 现在一切正常,除了标签表中出现大量重复项。 我需要做什么才能避免标签表中出现重复(基于名
我试图弄清楚 rails 是如何决定命名一个表的。我不得不反复试验才能弄清楚。 该表最终被命名为 menu_categories_items .我想知道它是如何做到的。 楷模 # == Schema
我对 HABTM 与 Rails 3.2.11 的关联有点困惑。 我有一个图像模型: class Image false do |t| t.references :image
我有研讨会表和类别表。 车间模型: has_many :workshop_categories, dependent: :destroy has_many :categories, throu
我有两个模型,Conversation 和 Phones,它们彼此有_and_belongs_to_many 个。电话可以有很多对话,对话可以有很多电话(两个或更多)。 class Conversat
修复者:更改模型名称以匹配 Rails 命名约定 当我尝试将技能加入用户时出现以下错误: irb(main):006:0> user.skills ' from script/rai
我试图让 mongoid 保存关联,但我只能让一侧工作。如果我有以下测试。 test "should add a user as a follower when a user follows th
我的 Ruby On Rails 项目中的 has_and_belongs_to_many 关联有问题。 这是我的模型: class Store false, :force => true do |
c = Course.create name:"Math1", ?? 我试图弄清楚如何将这门类(class)与 has_and_belongs_to_many 的现有学生联系起来。下面是我的关联模式。
预订 has_and_belongs_to_many学生们 学生 has_and_belongs_to_many图书 在 BooksStudents 模型中,我想在商店中添加“状态”字段,如果它是租用
嗨,我在模型中使用 has_and_belongs_to_many。 我想为种类设置存在的 valitor。 并将每个核心的最大种类数设置为 3 class Core 'core_id', :ass
一般混淆 我有可以有 3 种类型的乐队。我读了 previous SO post处理这个问题的正确方法是几个步骤: 1) 带内.rb has_and_belongs_to_many :genres 2
我有 field 和照片的模型: class Venue 这是我的 Edit 和 Update 方法的
我不知道这是否是 oracle_enhanced 适配器的问题。我有: class Room []) end end 日志 Started POST "/manuals" for 127.0
我正在尝试在 Ruby on Rails 项目中执行以下操作: class FoodItem :food_categories end class FoodCategory :food_categ
我有一个模型 UseCases(大约 6.000 行)和 EducationalObjectives(大约 4.000 行)与 has_and_belongs_to_many(EducationalO
我是一名优秀的程序员,十分优秀!