module ContactFilterExtension
unloadable
def in_context(context)
if proxy_owner.context == :special_area && context != :admin
scoped(:conditions => {:public => true})
else
scoped({})
end
end
end
тогда
class ContactContainer < ActiveRecord::Base
unloadable
has_many :contacts, :dependent => :destroy, :order => :position, :extend => ContactFilterExtension
end
затем в контроллере:
def index
@contacts = @contact_container.contacts.in_context(context)
end
Это, конечно, просто :) Это также означает, что вы можете связать другие области видимости после этой, а также создавать новые записи вне контекста. Довольно аккуратно.
Также обратите внимание, что есть два контекста, один из которых мы можем знать только в контроллере (где пользователь находится в системе), а другой - контекст ContactContainer, который мы можем найти только с помощью моделей.
Также обратите внимание, что использование Контактов в качестве примера не было реальным случаем: D