好的,自从我设置了一些多态 :through 关系以来,发生了一些奇怪的事情。
我将 Rails 3.2.12 与 Ruby 1.9.3 一起使用。
关系如下:
class User < ActiveRecord::Base
has_many :registrations
has_many :student_learning_component_statuses, :through => :registrations
has_many :programs, :through => :student_learning_component_statuses, :source => :statusable, :source_type => 'Program'
has_many :phases, :through => :student_learning_component_statuses, :source => :statusable, :source_type => 'Phase'
现在,当我查询用户的程序或阶段时,无论我先查询哪个总是成功,第二个查询的关系返回一个空数组。
控制台使用结果如下图:
1.9.3p392 :005 > User.find_by_email('s1@nyfs.com').programs
User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."email" = 's1@nyfs.com' LIMIT 1
Program Load (1.4ms) SELECT "programs".* FROM "programs" INNER JOIN "student_learning_component_statuses" ON "programs"."id" = "student_learning_component_statuses"."statusable_id" INNER JOIN "registrations" ON "student_learning_component_statuses"."registration_id" = "registrations"."id" WHERE "registrations"."user_id" = 137 AND ("student_learning_component_statuses"."statusable_type" = 'Program')
=> [#<Program id: 1, title: "Beginner Certification", description: "", school_id: 47, created_at: "2013-06-27 19:46:44", updated_at: "2013-06-27 22:13:27", duration: "16 weeks">, #<Program id: 2, title: "Instructor Certification", description: "Another Program to test more stuff", school_id: 47, created_at: "2013-06-28 02:14:43", updated_at: "2013-06-28 02:14:43", duration: "20 weeks">]
1.9.3p392 :006 > User.find_by_email('s1@nyfs.com').phases
User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."email" = 's1@nyfs.com' LIMIT 1
Phase Load (0.7ms) SELECT "phases".* FROM "phases" INNER JOIN "student_learning_component_statuses" ON "phases"."id" = "student_learning_component_statuses"."statusable_id" INNER JOIN "registrations" ON "student_learning_component_statuses"."registration_id" = "registrations"."id" WHERE "registrations"."user_id" = 137 AND ("student_learning_component_statuses"."statusable_type" = 'Program' AND "student_learning_component_statuses"."statusable_type" = 'Phase')
=> []
请注意,第二个查询的结尾会检查statusable_type = 'Program' AND statusable_type = 'Phase'
,这绝不会是这种情况。有没有人遇到过这样的问题?是时候升级到 Rails 4 了吗?或者也许我的人际关系出了问题。
如果更多代码可能有用,请告诉我,并提前感谢您的任何建议。
[更新]
根据我的研究,这个问题的修复在 Rails 4 的 master 分支上还没有集成,所以我现在将继续推迟到 Rails 4 的升级。