2017-02-11 3 views
0

In meiner Rails 4 App habe ich Benutzer und Konten. Ich möchte eine has_many durch Beziehung erstellen. Die Sache ist, dass ich den Klassennamen ändern möchte, so dass ein Konto viele Manager des Typs Benutzer hat. Das Konto auf der anderen Seite hat viele Managed (vom Typ Konto)Viele-zu-viele mit benutzerdefinierten Modellnamen in Rails 4

So habe ich meine durch Tabelle:

class AccountManager < ActiveRecord::Base 
    belongs_to :account, class_name: 'Managed' 
    belongs_to :user, class_name: 'Manager' 
end 

In meinem Konto Modell habe ich:

has_many :account_managers 
has_many :managers, :through => :account_managers, :source => :user 

Aber wenn ich tun Account.first.managers, erhalte ich:

nicht initialisierte konstante Konto :: Manager-

Alles was ich vergessen habe?

+0

Können Sie Ihre Manager-Klasse veröffentlichen? –

+0

Managerklasse existiert nicht. Es ist die Benutzerklasse, aber ich möchte sie in meiner Beziehung Manager nennen. Ich weiß nicht, ob das klar wird. – almo

+0

In diesem Fall würde 'AccountManger.first.user' auch nicht funktionieren. Die 'coins_to'-Beziehung, die Sie geschrieben haben, gibt Manager als Klassenname an. Sie sollten schreiben 'gehört_zu: Manager, Klassenname: 'Benutzer', Fremdschlüssel:: (Benutzer/Manager) _id' –

Antwort

0

Ich hatte es mit einem benutzerdefinierten Namen für User arbeiten, aber dann, wenn ich einen benutzerdefinierten Namen für Account hinzugefügt, es hielt die Suche nach Typ, die es nur tun soll, wenn es polymorph ist. Ich konnte nicht das Problem beheben und ich am Ende dieses Befund, die voll und ganz die Art und Weise zu funktionieren scheint, ich glaube, Sie müssen es (siehe Nic-Lösung am Boden, nicht die akzeptierte Antwort):

has_many :through with class_name and foreign_key

auf der Grundlage dieser Antwort, wenn sie Ihre Modelle und Migrationen wie folgt aussehen, sollte es funktionieren:

class Account < ActiveRecord::Base 
    has_many :manager_account_pairs 
    has_many :account_managers, through: :manager_account_pairs, source: :user 
end 

class User < ActiveRecord::Base 
    has_many :manager_account_pairs 
    has_many :managed_accounts, through: :manager_account_pairs, source: :account 
end 

class ManagerAccountPair < ActiveRecord::Base 
    belongs_to :account 
    belongs_to :user 
end 

class CreateAccount < ActiveRecord::Migration 
    def change 
    create_table :accounts do |t| 
     t.string :name, index: { unique: true } 
     t.timestamps null: false 
    end 
    end 
end 

class CreateUser < ActiveRecord::Migration 
    def change 
    create_table :users do |t| 
     t.string :email, index: { unique: true } 
     t.string :first_name 
     t.string :last_name 
     t.string :username, index: { unique: true } 
     t.timestamps null: false 
    end 
    end 
end 

class CreateManagerAccountPair < ActiveRecord::Migration 
    def change 
    create_table :manager_account_pairs do |t| 
     t.integer :account_id 
     t.integer :user_id 
     t.timestamps null: false 
    end 
    end 
end 

Hier ist eine seed-Datei mit testen:

User.create(email: '[email protected]',   first_name: 'Lisa', last_name: 'Hawkins', username: 'lhawkinsa') 
User.create(email: '[email protected]',   first_name: 'Helen', last_name: 'Taylor', username: 'htaylorb') 
User.create(email: '[email protected]',   first_name: 'Gregory', last_name: 'Taylor', username: 'gtaylorc') 
User.create(email: '[email protected]',  first_name: 'Henry', last_name: 'Lane',  username: 'hlaned') 
User.create(email: '[email protected]', first_name: 'Harry', last_name: 'Phillips', username: 'hphillipse') 
User.create(email: '[email protected]',   first_name: 'Jeffrey', last_name: 'Gonzales', username: 'jgonzalesf') 
User.create(email: '[email protected]',   first_name: 'Lori', last_name: 'James', username: 'ljamesg') 
User.create(email: '[email protected]',    first_name: 'Roger', last_name: 'Hill',  username: 'rhillh') 
User.create(email: '[email protected]',  first_name: 'Raymond', last_name: 'Harvey', username: 'rharveyi') 
User.create(email: '[email protected]',    first_name: 'Stephen', last_name: 'Perry', username: 'sperryj') 

Account.create(name: 'Ooba') 
Account.create(name: 'Avamba') 
Account.create(name: 'Linktype') 
Account.create(name: 'Brainsphere') 
Account.create(name: 'Wordtune') 

ManagerAccountPair.create(account_id: 1, user_id: 1) 
ManagerAccountPair.create(account_id: 2, user_id: 2) 
ManagerAccountPair.create(account_id: 3, user_id: 3) 
ManagerAccountPair.create(account_id: 4, user_id: 4) 
ManagerAccountPair.create(account_id: 5, user_id: 5) 
ManagerAccountPair.create(account_id: 1, user_id: 6) 
ManagerAccountPair.create(account_id: 2, user_id: 7) 
ManagerAccountPair.create(account_id: 3, user_id: 8) 
ManagerAccountPair.create(account_id: 4, user_id: 9) 
ManagerAccountPair.create(account_id: 5, user_id: 10) 

Konsolenausgabe:

~/workspace/rails_four_example>> rails c 
Running via Spring preloader in process 8465 
Loading development environment (Rails 4.2.7.1) 

    2.3.3 :001 > Account.first.account_managers 
Account Load (1.2ms) SELECT "accounts".* FROM "accounts" ORDER BY "accounts"."id" ASC LIMIT 1 
User Load (0.8ms) SELECT "users".* FROM "users" INNER JOIN "manager_account_pairs" ON "users"."id" = "manager_account_pairs"."user_id" WHERE "manager_account_pairs"."account_id" = $1 [["account_id", 1]] 
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 1, email: "[email protected]", first_name: "Lisa", last_name: "Hawkins", username: "lhawkinsa", created_at: "2017-02-12 19:58:42", updated_at: "2017-02-12 19:58:42">, #<User id: 6, email: "[email protected]", first_name: "Jeffrey", last_name: "Gonzales", username: "jgonzalesf", created_at: "2017-02-12 19:58:42", updated_at: "2017-02-12 19:58:42">]> 

    2.3.3 :002 > User.first.managed_accounts 
User Load (0.8ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 
Account Load (0.5ms) SELECT "accounts".* FROM "accounts" INNER JOIN "manager_account_pairs" ON "accounts"."id" = "manager_account_pairs"."account_id" WHERE "manager_account_pairs"."user_id" = $1 [["user_id", 1]] 
=> #<ActiveRecord::Associations::CollectionProxy [#<Account id: 1, name: "Ooba", created_at: "2017-02-12 19:58:42", updated_at: "2017-02-12 19:58:42">]>