Rails: plusieurs «Has_Many Through» pour les deux mêmes modèles?
-
23-09-2019 - |
Question
Je ne peux pas envelopper ma tête autour de ça ...
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
... ce qui fonctionne bien pour ma relation principale, en ce que un User
boîte ont de nombreux Fantasies
, et que un Fantasy
boîte appartenir trop Users
.
Cependant, j'ai besoin d'ajouter une autre relation pour fidèle (comme dans, un User
"aime" un Fantasy
Plutôt que de "l'a" ... pensez à Facebook et comment vous pouvez "aimer" un poste mural, même s'il ne vous "appartient" pas ... en fait, l'exemple Facebook est presque exactement ce que je M visant).
J'ai rassemblé que je devrais faire une autre association, mais je suis un peu confus quant à la façon dont je pourrais l'utiliser, ou si c'est même la bonne approche. J'ai commencé par ajouter ce qui suit:
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
... mais comment créer l'association à travers Approval
plutôt que par Fantasizing
?
Si quelqu'un pouvait me mettre directement là-dessus, je serais très obligé!
La solution
Gardez votre premier ensemble de code, alors dans votre modèle d'utilisateur, ajoutez:
has_many :approved_fantasies, :through => :fantasizings, :source => :fantasy, :conditions => "fantasizings.is_approved = 1"
Dans votre table de fantasme, ajoutez un champ booléen IS_APVÉRÉ.