Use ActiveRecord para encontrar o resultado de 5 tabelas aninhadas
-
25-09-2019 - |
Pergunta
Eu tenho um modelo de usuário (:nome,:senha,:email) e modelo de evento (:nome,:etc) e modelo de interesse (:nome)
Então criei duas tabelas de junção -> UsersInterests e EventsInterests;cada um não contendo uma chave primária e composto apenas por user_id/interest_id e event_id/interest_id respectivamente.
Estou tentando usar o ActiveRecord para consultar uma lista de todos os eventos onde o interest.id de EventsInterests=interesse.id de UsersInterests
Estou usando relacionamentos has_many e pertence_to com o Plug-in de loop aninhado
Meus modelos são assim =>
usuário.rb
has_many :users_interests
has_many :interests, :through => :users_interests
evento.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
usuários_interesse.rb
belongs_to :users
belongs_to :interests
eventos_interests.rb
belongs_to :interests
belongs_to :events
Se @user=User.find(1), como eu consultaria os eventos nos quais um usuário estaria interessado?
Eu inventei isso => @events.find (: all ,: condições => eventsinterests.interest_id = usersinterests.interest_id) ??
mas recebo o erro
undefined method `interest_id' for UsersInterests(user_id: integer, interest_id: integer):Class
umm..que merda?qualquer ajuda pessoal....estou nisso há uns 4 dias
Solução
Primeiro, entre no console e certifique-se de que todos os seus relacionamentos funcionem:
User.first.events
User.first.interests
Events.first.users
Interests.first.users
Interests.first.events
# ... and so
Só para esclarecer, um usuário lista seus interesses e você deseja obter uma lista dos eventos que correspondem a esses interesses?
User.first.interests.collect { |interest| interest.events }.uniq
Não é particularmente eficiente, mas eficaz e fácil de compreender.
Você poderia usar User.first.interests_singular_ids
para obter os ids e passá-los para find() com interest_id IN(...)
essa lista também.Não tenho certeza de quão mais rápido seria, no entanto.