Association issues with `Polymorphic association does not support to compute class.` in polymorphic belongs_to with sti
Matthew Harrington
I meet a relationship creation problem when I try to create a new instance of an object, I get the error Polymorphic association does not support to compute class..
I get this error uniquely on front-end, everything seems to work fine in console.
Here are classes:
vizualization > base.rb
module Vizualization class Base < ApplicationRecord belongs_to :vizualization_item, polymorphic: true end
endvizualization > foo_viz.rb
module Vizualization class FooViz < Base end
endFoo.rb
class Foo < ApplicationRecord has_one :vizualization, class_name: "Vizualization::FooViz", as: :vizualization_item, inverse_of: :vizualization_item
endRelationship seems to work as I can do following requests:
- ParticipativeDatavizualization::FooViz.last.datavizualization_item
- FooViz.last.cfp.participative_datavizualization
Any idea why it could work on console but not in front-end ?
Any help would be appreciated.
Ps: I've already read these two posts, 1, 2, but I didn't reach any solution. Also tried this gem but i didn't get it working.
11 Answer
I did the same associations as you, and it works well in both console and view. I share my settings, maybe you can reference.
# 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>then run in console:
foo = Foo.create
Vizualization::FooViz.create(vizualization_item: foo)then go to , you can find
I'm Foo and my Id: 1, Class: Foo
I'm FooViz and my Id: 1, Class: Vizualization::FooViz