【问题标题】:Polymorphics in Rails ' uninitialized constant' errorRails 中的多态性“未初始化常量”错误
【发布时间】:2016-07-06 22:00:42
【问题描述】:

我想在我的项目中建立多态关联,所以我按照 Rails 指南去做,但我得到了:NameError: uninitialized constant DashboardAssignment::Assignable 错误。

型号:

仪表板分配:

class DashboardAssignment < ActiveRecord::Base
  belongs_to :dashboard
  belongs_to :assignable, polymorphic: true

  validates :dashboard, presence: true
  validates :assignable, presence: true, uniqueness: { :scope => :dashboard }
end

用户:

class User < ActiveRecord::Base
  has_many :dashboard_assignments, as: :assignable
  has_many :dashboards, through: :dashboard_assignments
end

组:

class Group < ActiveRecord::Base
  has_one :dashboard_assignment, as: :assignable
  has_many :laboratories_assignments, as: :lab_assignable
end

仪表板:

class Dashboard < ActiveRecord::Base
  has_one :building
  has_many :dashboard_assignments
  has_many :users, through: :dashboard_assignments, as: :assignable
end

在 DashboardAssignment Migration 文件中我有:

t.references :assignable, null: false, polymorphic: true, index: true

当我尝试通过 DashboardAssignment.create(assignable: u) 创建新的 DashboardAssignment 时,u = User.find(1) 它给了我错误:

NameError: uninitialized constant DashboardAssignment::Assignable
    from P:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-4.2.6/lib/active_record/inheritance.rb:158:in `compute_type' ...

我做错了吗?

我的 rails 版本是 4.2.6

【问题讨论】:

  • 错误告诉您的是,在 DashboardAssignment 类上没有称为可分配的属性或关联。能否请您发布您的仪表板模型?
  • 好的。添加仪表板模型
  • 我很确定,你的问题存在是因为:has_many :users, through: :dashboard_assignments, as: :assignable
  • 我觉得这个可以帮到你:stackoverflow.com/questions/5886738/…
  • 尝试使用 source: 而不是 as: 还是一样

标签: ruby-on-rails ruby ruby-on-rails-4 model polymorphic-associations


【解决方案1】:

您应该在 through 关联中使用 source 而不是 as

class Dashboard < ActiveRecord::Base
  has_one :building
  has_many :dashboard_assignments
  has_many :users, through: :dashboard_assignments, source: :assignable
end

我会提醒您,这可能会给您assignables 属于Group 类。解决此问题的最佳方法是为dashboard_assignments 添加一个条件到has_many,让您只过滤具有assignable_type = 'User'dashboard_assignments

class Dashboard < ActiveRecord::Base
  has_one :building
  has_many :user_dashboard_assignments, -> { where(assignable_type: 'User') }, class_name: 'DashboardAssignment'
  has_many :users, through: :user_dashboard_assignments, source: :assignable
end

【讨论】:

  • 我尝试更改这些行,但仍然出现相同的错误。我的项目在那里是开源的:github.com/GRM-dev/IMP/tree/Polimorphic 在多态分支上
  • 啊,这可能是我的错误 :) 在 DashboardAssignment 中,我有一行 validates :assignable, presence: true, uniqueness: { :scope =&gt; :dashboard } 当我删除它并将 as: 更改为 source: 时,一切似乎都正常。还在该行中添加了source_type: "User"
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2016-07-15
  • 1970-01-01
相关资源
最近更新 更多