Используйте ActiveRecord, чтобы найти результат 5 вложенных таблиц - PullRequest
1 голос
/ 03 февраля 2010

У меня есть модель пользователя (: имя,: пароль,: электронная почта), модель события (: имя,: и т. Д.) И модель интереса (: имя)

Затем я создал две таблицы соединения ->UsersInterests и EventsInterests;каждый из которых не содержит первичного ключа и состоит только из user_id / Interest_id и event_id / Interest_id соответственно.

Я пытаюсь использовать ActiveRecord, чтобы запросить список всех событий, где интереса.id из EventsInterests = интереса.id UsersInterests

Я использую отношения has_many и own_to с плагином для вложенных циклов

Мои модели выглядят так =>

user.rb

has_many :users_interests
has_many :interests, :through => :users_interests

event.rb

has_many :events_interests
has_many :interests, :through => :events_interests

Interest.rb

belongs_to :users , :through => :users_interests
belongs_to :events , :through => :events_interests

users_interests.rb

belongs_to :users
belongs_to :interests

events_interests.rb

belongs_to :interests
belongs_to :events

Если @ user = User.find (1), Как бы я запросил события, которые будут интересовать пользователя?

Я придумал это => @ events.find (: все,: условия => EventsInterests.interest_id = UsersInterests.interest_id) ??

но я получаю ошибку

undefined method `interest_id' for UsersInterests(user_id: integer, interest_id: integer):Class

мммм..wtf?Любая помощь, ребята .... Я был в этом, как 4 дня

1 Ответ

1 голос
/ 03 февраля 2010

Сначала прыгните в консоль и убедитесь, что все ваши отношения работают:

User.first.events
User.first.interests
Events.first.users
Interests.first.users
Interests.first.events
# ... and so

Просто чтобы уточнить, пользователь перечисляет свои интересы, а вы хотите получить список событий, соответствующих этим интересам?

User.first.interests.collect { |interest| interest.events }.uniq

Не особенно эффективно, но эффективно и легко понять.

Вы можете использовать User.first.interests_singular_ids, чтобы получить идентификаторы и передать их в find () с interest_id IN(...) этим списком. Хотя я не уверен, насколько быстрее это будет.

...