Verwenden Sie ActiveRecord, um das Ergebnis von 5 verschachtelten Tabellen zu finden
-
25-09-2019 - |
Frage
Ich habe ein Benutzermodell (:name, :password, :email), ein Ereignismodell (:name, :etc) und ein Interessenmodell (:name).
Dann habe ich zwei Join-Tabellen erstellt -> UsersInterests und EventsInterests;Jeder enthält keinen Primärschlüssel und besteht nur aus der Benutzer-ID/Interessen-ID bzw. der Ereignis-ID/Interessen-ID.
Ich versuche, ActiveRecord zu verwenden, um eine Liste aller Ereignisse abzufragen, bei denen die Interest.ID von EventsInterests = Interest.ID von UsersInterests ist
Ich verwende has_many- und gehört_to-Beziehungen mit dem Nested-Loop-Plugin
Meine Modelle sehen so aus =>
user.rb
has_many :users_interests
has_many :interests, :through => :users_interests
event.rb
has_many :events_interests
has_many :interests, :through => :events_interests
Interesse.rb
belongs_to :users , :through => :users_interests
belongs_to :events , :through => :events_interests
user_interests.rb
belongs_to :users
belongs_to :interests
events_interests.rb
belongs_to :interests
belongs_to :events
Wenn @user= User.find(1), wie würde ich die Ereignisse abfragen, an denen ein Benutzer interessiert wäre?
Ich habe dieses => @events.find (: All,:: Condums => eventsInterests.interest_id = userInterests.interest_id) entwickelt?
aber ich bekomme den Fehler
undefined method `interest_id' for UsersInterests(user_id: integer, interest_id: integer):Class
ähm...wtf?Irgendwelche Hilfe, Leute ... Ich bin seit ungefähr 4 Tagen dabei
Lösung
Gehen Sie zunächst in die Konsole und stellen Sie sicher, dass alle Ihre Beziehungen funktionieren:
User.first.events
User.first.interests
Events.first.users
Interests.first.users
Interests.first.events
# ... and so
Nur zur Klarstellung: Ein Benutzer listet seine Interessen auf und Sie möchten eine Liste der Ereignisse erhalten, die diesen Interessen entsprechen?
User.first.interests.collect { |interest| interest.events }.uniq
Nicht besonders effizient, aber effektiv und leicht verständlich.
Du könntest benutzen User.first.interests_singular_ids
um die IDs zu erhalten und diese an eine find() mit zu übergeben interest_id IN(...)
auch diese Liste.Ich bin mir jedoch nicht sicher, wie viel schneller es wäre.