Сжатие условия поиска на основе контекстов времени выполнения - PullRequest
2 голосов
/ 27 июня 2009

Ух ты сумасшедший титул! Но вот проблема. Стремясь высушить приложение своей системы управления веб-сайтом, я успокоил модуль своего приложения (FileSet) и поместил его в одном месте. Ранее FileSet использовался в общей системе веб-сайтов, а также в системе обучения детей. Они оба вели себя одинаково, за исключением одного нюанса. В области для детей файлы FileSet были разделены на две категории: загрузочные и обычные. Учебные файлы - это те, которые сделали учителя, а обычные - те, которые сделали дети. Теперь в общем приложении веб-сайта это различие не имеет значения и поэтому игнорируется. Вот сложная часть. Я хочу использовать одни и те же контроллеры и представления в обоих контекстах. Во время выполнения я знаю, что набор файлов принадлежит либо к общему сайту, либо к этой области обучения, поэтому я могу сказать, что если он находится в контексте области обучения, я хочу ограничить использование FileSet.find (x) .files только символом ' нормальная 'именованная область. Если контекст является обычным веб-сайтом, то мы просто не будем использовать именованную область.

Я упростил приведенную выше информацию, но в основном вопрос в том, как я могу вызвать FileSet.find (x) .files и сделать так, чтобы метод files был достаточно умным, чтобы сузить результаты, возвращаемые на основе контекста времени выполнения?

Я немного изучил расширение ассоциации, но, похоже, это не работает. Я надеюсь, что здесь что-то есть. Я отчаянно пытаюсь сохранить эту логику в модели и не иметь связанных с ней представлений или контроллеров. Области по умолчанию работали бы, если их оценивать во время выполнения:)

Жду некоторых предложений:)

Приветствия

Брендон

1 Ответ

2 голосов
/ 27 июня 2009

Можете ли вы использовать именованную область видимости с процедурой, которая определяет текущий контекст и возвращает соответствующие условия? Примерно так в Файле:

named_scope :for_context, :conditions => lambda { 
  if only_normal?
    { :type => 'normal' }
  elsif only_startup?
    { :type => 'normal' }
  else
    {}
  end
}

тогда вы можете позвонить:

FileSet.find(x).files.for_context
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...