【问题标题】:Association issues with `Polymorphic association does not support to compute class.` in polymorphic belongs_to with sti“多态关联不支持计算类”的关联问题。在多态属于 sti 中
【发布时间】:2020-07-08 19:44:00
【问题描述】:

我在尝试创建对象的新实例时遇到关系创建问题,我收到错误 Polymorphic association does not support to compute class.。 我在前端唯一收到此错误,在控制台中似乎一切正常。

这里是类:

可视化 > base.rb

module Vizualization
  class Base < ApplicationRecord
    belongs_to :vizualization_item, polymorphic: true
  end
end

可视化 > foo_viz.rb

module Vizualization
  class FooViz < Base
  end
end

Foo.rb

class Foo < ApplicationRecord
  has_one :vizualization, class_name: "Vizualization::FooViz",
                          as: :vizualization_item,
                          inverse_of: :vizualization_item
end

关系似乎有效,因为我可以执行以下请求:

  • ParticipativeDatavizualization::FooViz.last.datavizualization_item
  • FooViz.last.cfp.participative_datavizualization

知道为什么它可以在控制台上运行但不能在前端运行吗?

任何帮助将不胜感激。

Ps:我已经看过这两个帖子,1, 2,但是我没有找到任何解决方案。也尝试了this gem,但我没有得到它的工作。

【问题讨论】:

  • 这听起来不像是普通的 rails 错误。我怀疑这里还有更多的玩法。

标签: ruby-on-rails ruby polymorphism associations belongs-to


【解决方案1】:

我做了和你一样的关联,它在控制台和视图中都很好用。 我分享我的设置,也许你可以参考一下。

# 20200328045328_create_vizualization_bases.rb
class CreateVizualizationBases < ActiveRecord::Migration[5.2]
  def change
    create_table :vizualization_bases do |t|
      t.integer :vizualization_item_id
      t.string :vizualization_item_type
      t.string :type, index: true

      t.timestamps
    end
    add_index :vizualization_bases,  [:vizualization_item_type, :vizualization_item_id], name: 'inde_on_bases_for_poly'
  end
end

# 20200328045650_create_foos.rb
class CreateFoos < ActiveRecord::Migration[5.2]
  def change
    create_table :foos do |t|
      t.timestamps
    end
  end
end

# app/models/vizualization.rb
module Vizualization
  def self.table_name_prefix
    'vizualization_'
  end
end

# app/models/vizualization/base.rb
class Vizualization ::Base < ApplicationRecord
  belongs_to :vizualization_item, polymorphic: true
end

# app/models/vizualization/foo_viz.rb
class Vizualization::FooViz < Vizualization::Base
end

# config/routes.rb
Rails.application.routes.draw do
  root "application#hello"
end

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def hello
    @foo = Foo.first
    @foo_viz = @foo.vizualization
  end
end

# app/views/application/hello.html.erb
<h2>I'm Foo and my <%= "Id: #{@foo.id}, Class: #{@foo.class}" %></h2>
<h2>I'm FooViz and my <%= "Id: #{@foo_viz.id}, Class: #{@foo_viz.class}" %></h2>

然后在控制台中运行:

foo = Foo.create
Vizualization::FooViz.create(vizualization_item: foo)

然后去http://localhost:3000,就可以找到

I'm Foo and my Id: 1, Class: Foo
I'm FooViz and my Id: 1, Class: Vizualization::FooViz

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2012-03-26
    • 2014-12-16
    • 1970-01-01
    相关资源
    最近更新 更多