Я бы сделал это как область видимости в Списке
class List
named_scope :without_address, lambda { |address_id| { :joins => 'inner join address_list_memberships alm on alm.list_id = lists.id', :conditions => ['alm.address_id <> ?', address_id]}}
end
Теперь вы можете вызывать List.without_address (4), и вы можете также вызывать области действия.
Как указывает Matchu, вы можете сделать это без написания SQL-кода соединения:
class List
named_scope :without_address, lambda { |address_id| { :joins => :address_list_memberships, :conditions => ['address_list_memberships.address_id <> ?', address_id]}}
end
И убедитесь, что у вашей таблицы соединений есть индексы!
В миграции:
add_index "address_list_memberships", "address_id"
add_index "address_list_memberships", "list_id"
Другие способы форматирования named_scope см. В описании Сэма Саффрона: http://gist.github.com/162489