Ich bin implementieren das System, mit dem Benutzer folgen können "Followable" (in meinem Fall diese können ein Ereignis, Ort oder andere Benutzer sein).Viele zu viele mit polymorphe Zuordnung funktioniert nicht in beiden Richtungen
Meine Idee:
Folgen Modell (Join-Tabelle) die user_id, verfolgbare Art und followale_id hält
class Follow < ActiveRecord::Base
belongs_to :user
belongs_to :followable, polymorphic: true
end
Ereignis
class Event < ActiveRecord::Base
has_many :follows, as: :followable
has_many :users, through: :follows
end
Platz
class Place < ActiveRecord::Base
has_many :follows, as: :followable
has_many :users, through: :follows
end
Benutzer
class User < ActiveRecord::Base
has_many :follows
has_many :events, through: :follows, source: :followable, source_type: "Event"
has_many :places, through: :follows, source: :followable, source_type: "Place"
has_many :users, through: :follows, source: :followable, source_type: "User"
end
Das Problem ist, dass die real nur in eine Richtung funktioniert, ich tun kann:
user.follows.create(followable:event1) #follow event1
user.follows.create(followable:place1) #follow place1
user.follows.create(followable:user1) #follow user1
user.follows # displays all following relations user has established
Aber ich kann nicht tun:
event1.follows #return follow objects(some user - event1 pairs)
event1.users #return all of the users that follow this event
user1.users #return all of the users that user1 follows, the most confusing part..
Alle oben genannten Werte sind null.
Wie soll ich die Beziehungen herstellen, damit es in beide Richtungen funktioniert?
Außerdem würde ich gerne einige Bemerkungen darüber hören, wie ich diese Idee verbessern kann, weil es das erste Mal ist, dass ich mit komplexeren Realitäten herumspiele. Vielen Dank im Voraus.
Kurzübersicht: Sind Sie sicher, dass Sie keinen veralteten Cache von 'event1.follows' sehen? Was passiert, wenn Sie "event1.follows (true)" versuchen? (Das "true" hier weist ActiveRecord an, die Assoziation neu zu laden, anstatt ihren Cache zu verwenden, wenn sie es hat) –
Ausgabe: # –
Wojciech
Was ist mit 'event1.follows.to_sql'? –