Rails: multipli "has_many attraverso" per i due stessi modelli?
-
23-09-2019 - |
Domanda
Non riesco a avvolgere la testa attorno a questo ...
class User < ActiveRecord::Base
has_many :fantasies, :through => :fantasizings
has_many :fantasizings, :dependent => :destroy
end
class Fantasy < ActiveRecord::Base
has_many :users, :through => :fantasizings
has_many :fantasizings, :dependent => :destroy
end
class Fantasizing < ActiveRecord::Base
belongs_to :user
belongs_to :fantasy
end
... che funziona bene per la mia relazione principale, in quella a User
Potere avere molti Fantasies
, e che a Fantasy
Potere appartenere a molti Users
.
Tuttavia, devo aggiungere un'altra relazione per simpatia (come in, a User
"Mi piace" a Fantasy
Piuttosto che "lo ha" ... pensa a Facebook e a come puoi "come" un post muro, anche se non ti appartiene "... in effetti, l'esempio di Facebook è quasi esattamente quello che io" mi punta).
Ho raccolto che avrei dovuto fare un'altra associazione, ma sono un po 'confuso su come potrei usarla, o se questo è anche l'approccio giusto. Ho iniziato aggiungendo quanto segue:
class Fantasy < ActiveRecord::Base
...
has_many :users, :through => :approvals
has_many :approvals, :dependent => :destroy
end
class User < ActiveRecord::Base
...
has_many :fantasies, :through => :approvals
has_many :approvals, :dependent => :destroy
end
class Approval < ActiveRecord::Base
belongs_to :user
belongs_to :fantasy
end
... ma come posso creare l'associazione attraverso Approval
piuttosto che attraverso Fantasizing
?
Se qualcuno potesse mettermi direttamente su questo, sarei molto obbligato!
Soluzione
Conserva il tuo primo set di codice, quindi nel modello utente Aggiungi:
has_many :approved_fantasies, :through => :fantasizings, :source => :fantasy, :conditions => "fantasizings.is_approved = 1"
Nella tua tabella fantastica, aggiungi un campo booleano IS_APROVOTED.