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">]>
Können Sie Ihre Manager-Klasse veröffentlichen? –
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
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' –