Как использовать ActiveRecord для поиска несвязанных записей?

У меня есть отношения «многие ко многим», настроенные с помощью модели соединения. По сути, я позволяю людям выражать свои интересы в деятельности.

class Activity < ActiveRecord::Base
  has_many :personal_interests
  has_many :people, :through => :personal_interests
end

class Person < ActiveRecord::Base
  has_many :personal_interests
  has_many :activities, :through => :personal_interests
end

class PersonalInterest < ActiveRecord::Base
  belongs_to :person
  belongs_to :activity
end

Теперь я хочу выяснить: к каким действиям конкретный пользователь не проявил интерес? Сюда должны входить действия, в которых заинтересованы другие люди, а также действия, в которых нет заинтересованности.

Успешным (но неэффективным) методом были два отдельных запроса:

(Activity.all - this_person.interests).first

Как аккуратно выразить этот запрос в ActiveRecord? Есть ли (надежный, ухоженный) плагин, который абстрагирует запросы?


person Andres Jaan Tack    schedule 22.07.2009    source источник
comment
Если у кого-то есть какие-либо мысли о плагине Association Extensions или его преемнике, мне будет особенно интересно. (rubyforge.org/projects/assocext)   -  person Andres Jaan Tack    schedule 28.07.2009


Ответы (1)


Я думаю, что самым простым способом будет просто использовать фрагмент предложения SQL where через параметр :conditions.

Например:

Activity.all(:conditions => ['not exists (select 1 from personal_interests where person_id = ? and activity_id = activities.id)', this_person.id])

Полностью не проверено и, вероятно, работает не совсем правильно, но вы поняли идею.

person madlep    schedule 22.07.2009
comment
Потрясающе, это определенно работает для моего глаза! Тем не менее, я удивлен, что вам приходится использовать SQL. rubyforge.org/projects/assocext предположительно делает это как расширение AR, но, по-видимому, это не так. коснулись за три года. - person Andres Jaan Tack; 23.07.2009