"多态关联不支持计算类"的关联问题多态性belong_to与sti



当我尝试创建对象的新实例时,遇到了关系创建问题,我得到了错误Polymorphic association does not support to compute class.。我在前端收到了这个错误,控制台中的一切似乎都很好。

以下是类别:

活体化>base.rb

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

vizualization>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

关系似乎工作,因为我可以做以下请求:

  • 参与数据可视化::FooViz.last.datavizualization_item
  • FooViz.last.cfp.participive_datavizualization

知道为什么它可以在控制台上工作而不能在前端工作吗?

如有任何帮助,我们将不胜感激。

Ps:我已经读过这两篇文章,1,2,但我没有找到任何解决方案。我也试过这个宝石,但没有成功。

我做了与您相同的关联,它在控制台和视图中都能很好地工作。我分享我的设置,也许你可以参考。

# 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

最新更新