2009-06-03 7 views
37

Ich habe Probleme mit einer has_many through Verknüpfung zu arbeiten.Rails: HasManyThroughAssociationNotFoundError

Ich erhalte diese Ausnahme:

Article.find(1).warehouses.build 
ActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association :entries in model Article 

Dies sind die Modelle beteiligt: ​​

class Article < ActiveRecord::Base 
    has_many :warehouses, :through => :entries 
end 

class Warehouse < ActiveRecord::Base 
    has_many :articles, :through => :entries 
end 

class Entry < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :warehouse 
end 

Und das ist mein Schema:

create_table "articles", :force => true do |t| 
    t.string "article_nr" 
    t.string "name" 
    t.integer "amount" 
    t.string "warehouse_nr" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "unit" 
end 

create_table "entries", :force => true do |t| 
    t.integer "warehouse_id" 
    t.integer "article_id" 
    t.integer "amount" 
end 

create_table "warehouses", :force => true do |t| 
    t.string "warehouse_nr" 
    t.string "name" 
    t.integer "utilization" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Antwort

108

Sie benötigen

hinzufügen
has_many :entries 

Zu jedem Ihrer Modelle, da die Option: through nur eine zweite Assoziation angibt, die verwendet werden soll, um die andere Seite zu finden.

+2

können Sie auch ** t.references: warehouse,: null => false ** anstelle von ** t.integer "warehouse_id" ** in der create table beziehung ... mehr Rail-lish heutzutage. – carlosayam

+1

Mit dieser Änderung bekomme ich 'NameError: nicht initialisierte Konstante Artikel :: Eintrag '? – Meekohi

1

@Meekohi Dies bedeutet, dass Sie kein Einstiegsmodell haben. Ich habe die Fehlermeldung gerade erhalten und wollte sie darauf hinweisen (kann sie aufgrund der geringen Reputation nicht als Kommentar posten).

class Entry < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :warehouse 
end 

laufen einfach

rails g model Entry 
0

Sie würden

has_many :entries 

Zu jedem Modell hinzufügen müssen, und über has_many: durchgehend, wie folgt aus:

class Article < ActiveRecord::Base 
    has_many :entries 
    has_many :warehouses, :through => :entries 
end 

class Warehouse < ActiveRecord::Base 
    has_many :entries 
    has_many :articles, :through => :entries 
end 

Detailliertere Tutorial zum Umgang mit View und Con trollers