Rails - поиск результатов по двум таблицам соединения - PullRequest
0 голосов
/ 15 февраля 2010

У меня есть 3 таблицы данных и 2 таблицы соединения, соединяющие все. Я пытаюсь найти способ запроса результатов на основе условия, что данные таблицы объединения совпадают.

Для объяснения у меня есть таблицы пользователей, интересов и событий. Эти таблицы связаны через отношения HABTM (что хорошо для моих нужд, так как мне не нужно хранить какие-либо другие поля) и объединяются через две таблицы соединения. Поэтому у меня также есть таблица UsersInterests с (user_id, интереса_ид) и таблица EventsInterests с (event_id, интереса_ид).

Проблема возникает при попытке запроса всех событий, где интересы пользователей соответствуют интересам событий.

Я думал, что это будет выглядеть примерно так ...

 @events= Event.find(:all, :conditions => [@user.interests = @event.interests])

но я получаю ошибку "неопределенный метод` интереса "для nil: NilClass", что-то не так с моим синтаксисом или моей логикой?

Ответы [ 3 ]

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

Ваша проблема в том, что @user или @event не определены. Даже если вы определите их, перед выполнением этого оператора предоставленная опция условий будет недействительной, [@user.interests = @event.interests].

Эта именованная область видимости событий должна помочь

class Event < ActiveRecord::Base
  ...
  named_scope :shares_interest_with_user, lambda {|user|
    { :joins => "LEFT JOIN events_interests ei ON ei.event_id = events.id " +
         "LEFT JOIN users_intersets ui ON ui.interest_id = ei.interest_id",
      :conditions => ["ui.user_id = ?", user], :group_by => "events.id"
    }
end

@events = Event.shares_interest_with_user(@user)
0 голосов
/ 16 февраля 2010

Не уверен, что я полностью следую за тем, что вы пытаетесь сделать. Если у вас есть один пользователь, и вы хотите, чтобы все события, в которых этот пользователь также интересовался, что-то вроде:

Event.find(:all, :include => [:events_interests], :conditions => ['events_interests.interest_id in (?)', @user.interests.collect(&:id)])

, вероятно, должно работать.

0 голосов
/ 15 февраля 2010

Учитывая Event <-> Interest <-> User запрос всех событий, где интересы пользователей совпадают с интересами событий (таким образом, следующие найдут все такие события, которые интересуют это событие также интересы по крайней мере одного пользователя).

Первая попытка, самая простая вещь, которая может сработать:

@events = []
Interest.all.each do |i|
  i.events.each do |e|
    @events << e if i.users.any?
  end
end
@events.uniq!

Очень неэффективный, очень ресурсоемкий и ресурсоемкий. Создает много запросов SQL. Но выполняет свою работу.

Вторая попытка должна включать в себя сложное соединение, но чем больше я об этом думаю, тем больше я вижу, насколько расплывчата ваша проблема. Будь точнее.

...