8

Aus irgendeinem Grund ist der Quelltyp für eine polymorphe has_many :through Assoziation immer 0, obwohl ein :source_type festgelegt wurde.Warum ist der source_type für diese polymorphe Assoziation immer 0?

Hier ist, was meine Modelle aussehen ...

Foo:

has_many :tagged_items, :as => :taggable 
has_many :tags, :through => :tagged_items 

Bar:

has_many :tagged_items, :as => :taggable 
has_many :tags, :through => :tagged_items 

TaggedItem:

belongs_to :tag 
belongs_to :taggable, :polymorphic => true 

Tag:

has_many :tagged_items 
has_many :foos, :through => :tagged_items, :source => :taggable, :source_type => "Foo" 
has_many :bars, :through => :tagged_items, :source => :taggable, :source_type => "Bar" 

So nahe, wie ich das ist eine völlig in Ordnung Setup sagen kann, und ich bin in der Lage Tags zu erstellen/hinzufügen, aber die taggable_type endet immer 0.

Jede Idee ist, warum ist oben? Google hat nichts gefunden.

+0

Ich habe eine Schiene 4 Beispiel mit Tests [hier] (https : //github.com/raviolicode/has_many_polymorphic_example). Überprüfen Sie [getagged_item_test.rb] (https://github.com/raviolicode/has_many_polymorphic_example/blob/master/test/models/tagged_item_test.rb). Meine Tests bestehen. Diese Tests sollten für Sie fehlschlagen? – raviolicode

+0

Ja, das ist fehlgeschlagen, aber ich finde mein Problem. Im Grunde bin ich ein Idiot. Ich habe das Taggable_type-Feld als Ganzzahl verwendet. Do! – hobberwickey

+0

hobberwickey Bitte upvote meine Antwort, wenn Sie denken, dass mein Beispielprojekt Ihnen geholfen hat, Ihre Frage zu lösen :) – raviolicode

Antwort

4

Ich habe das selbst herausgefunden, ich habe nur geantwortet, weil ich sicher bin, dass ich nicht die erste oder letzte Person bin, die diesen dämlichen Fehler macht (tatsächlich habe ich das schon mal gemacht). Ich habe den Spaltentyp in das Feld taggable_type als Ganzzahl anstelle einer Zeichenfolge eingefügt.

Sie würden denken, dies könnte zu einem Fehler führen, tut es aber nicht. Es funktioniert einfach nicht.

5

Ein funktionierendes Beispiel mit Tests für die Modelle in der Frage gefunden here.

Der Grund, warum es nicht auf die Frage funktioniert hat ist die Migration db/migrate/[timestamp]_create_tagged_items wie diese erzeugt werden soll:

class CreateTaggedItems < ActiveRecord::Migration 
    def change 
    create_table :tagged_items do |t| 
     t.belongs_to :tag, index: true 
     t.references :taggable, polymorphic: true 

     t.timestamps 
    end 
    end 
end 

Beachten Sie, dass t.references :taggable, polymorphic:true zwei Spalten auf schema.rb generieren: So

t.integer "taggable_id" 
t.string "taggable_type" 

, mit den gleichen Modellen in der Frage und dieser Migration, bestehen die folgenden Tests:

require 'test_helper' 

class TaggedItemTest < ActiveSupport::TestCase 
    def setup 
    @tag = tags(:one) 
    end 

    test "TaggedItems have a taggable_type for Foo" do 
    foo = Foo.create(name: "my Foo") 
    @tag.foos << foo 

    assert TaggedItem.find(foo.id).taggable_type == "Foo" 
    end 


    test "TaggedItems have a taggable_type for Bar" do 
    bar = Bar.create(name: "my Bar") 
    @tag.bars << bar 

    assert TaggedItem.find(bar.id).taggable_type == "Bar" 
    end 
end 

Hinweis: Rails 3 hat eine aktive Ausgabe über has_many :through und polymorphe Verbände, wie here gezeigt. In Rails 4 ist dies jedoch gelöst.

PS: Da ich einige der Forschung über diese Frage tat, könnte ich auch die Antwort, falls jemand veröffentlichen kann davon profitieren ... :)

Verwandte Themen