Установка области действия модели для оставшейся части запроса - PullRequest
1 голос
/ 29 июня 2009

Мне интересно, есть ли способ установить область видимости для класса модели для остальной части запроса? То есть Я хочу уменьшить некоторые результаты, но я хочу сделать это без ведома основного успокоительного контроллера (возможно, в before_filter, введенном в контроллер).

Contacts.scope = { :conditions => {:public => true} } if ladeda

затем позже

Contacts.all

должен вернуть контакты с прицелом. Это просто притворный код, кто-нибудь знает, возможно ли это?

Приветствия

Брендон

Ответы [ 3 ]

1 голос
/ 29 июня 2009

Вот как бы я это сделал:

class Contact < ActiveRecord::Base
  named_scope :public_only, :conditions => {:public => true}
end

class ApplicationController
  protected
  def contacts
    @_contacts ||= ladeda ? Contact.public_only  : Contact
  end
end

class ContactsController < ApplicationController
  def index
    @contacts = contacts.all
  end
end

Я переношу решение использовать область видимости или нет на вспомогательный метод. В качестве альтернативы вы можете переместить вспомогательный метод к самой модели Contact, например так:

class Contact < ActiveRecord::Base
  def self.for_index
    ladeda ? self.public_only : self
  end
end

class ContactsController < ApplicationController
  def index
    @contacts = Contact.for_index
  end
end
0 голосов
/ 02 июля 2009
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

0 голосов
/ 29 июня 2009

Я не думаю, что метод области видимости даже существует.

Чтобы он работал для всех последующих вызовов, используйте

Contacts.default_scope(:conditions => {:public => true})

Чтобы сделать эту ошибку менее ужасной, возможно, используйте фильтр округления и перезапишите

Contact.default_scope(:conditions => "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...