1

好的,自从我设置了一些多态 :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 的升级。

4

1 回答 1

2

显然,这个问题虽然很少见,但 Rails 团队知道:

问题描述: https ://github.com/rails/rails/issues/3882

潜在问题: https ://github.com/rails/rails/pull/10538

可能提供修复的代码补丁: https ://github.com/rails/rails/commit/b644c51c0ad22ff309d9717b7e9a3bfbc856a8c4

我没有修补代码,而是选择遵循第一个链接中概述的“hack”。对于我的特定用例,hack 如下(我已经验证它确实有效):

  has_many :_users_programs, :through => :registrations, :source => :student_learning_component_statuses # workaround (do not use directly)
  has_many :programs, :source_type => 'Program', :source => :statusable, :through => :_users_programs

  has_many :_users_phases, :through => :registrations, :source => :student_learning_component_statuses # workaround (do not use directly)
  has_many :phases, :source_type => 'Phase', :source => :statusable, :through => :_users_phases
于 2013-07-11T15:02:08.163 回答