Mise en place de deux associations à la même table est l'une des associations les plus délicates dans ActiveRecord. La clé consiste à configurer différentes associations pour chaque colonne de clé étrangère.
permet donc commencer par la table de jointure:
# This is a Rails 5 migration - don't copy paste it
# You'll have to generate one for rails 4
class CreateReferrals < ActiveRecord::Migration[5.0]
def change
create_table :referrals do |t|
t.belongs_to :referrer_id, foreign_key: false
t.belongs_to :referred_id, foreign_key: false
# Since the table for the foreign key cannot be automatically derived you need to add them manually
add_foreign_key :referrals, :clients, column: :referrer_id
add_foreign_key :referrals, :clients, column: :referred_id
t.timestamps
end
end
end
Permet de configurer les associations sur le renvoi:
class Referral < < ActiveRecord::Base
belongs_to :referrer, class_name: 'Client'
belongs_to :referred, class_name: 'Client'
end
Rien funky ici encore. class_name: 'Client'
indique à ActiveRecord (AR) sur quelle table pointe l'association car elle ne peut pas être dérivée du nom de l'association. permet maintenant de créer les associations inverses sur le client:
class Client < ActiveRecord::Base
has_many :referrals, class_name: 'Referral',
foreign_key: 'referrer_id'
has_many :referrals_as_referred, class_name: 'Referral',
foreign_key: 'referred_id'
end
Pour ajouter les associations à d'autres clients qui sont référés ou référants à un client utilisant une assocation indirecte:
class Client < ActiveRecord::Base
# ...
# clients reffered by this client
has_many :referred_clients,
through: :referrals,
source: :referred
has_many :referrers,
through: :referrals_as_referred,
source: :referrer
end
through: :referrals
dit AR rejoindre grâce à l'association nommée :referrals
.
source: :referred
indique l'association sur la table de jointure à utiliser.
Je vous recommande d'utiliser une table de jointure http://guides.rubyonrails.org/active_record_migrations.html#creating-a-join-table –
vous essayez de Semble faire des associations many-to-many, avec Referrals comme table de jointure. – EJ2015