【问题标题】:Rails has_many through polymorphic source_type scope_chain bugRails has_many 通过多态 source_type scope_chain bug
【发布时间】:2013-07-08 23:46:37
【问题描述】:

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

现在,当我查询用户的程序或阶段时,无论我查询 first 总是成功,并且查询的关系 second 返回一个空数组。

控制台使用结果如下图:

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。

【问题讨论】:

  • 你的用户类正在扩展 ActiveRecord::Base 我猜?:class User
  • 是的,它是 ActiveRecord::base 的子类
  • stackoverflow.com/questions/1683265/… 相比,我在这里看到的区别是 student_learning_component_statuses 是另一种基于注册的连接模型,在这种情况下可能会导致麻烦

标签: ruby-on-rails polymorphic-associations


【解决方案1】:

显然,这个问题虽然很少见,但 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-06
    • 2012-04-11
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多