Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Ruby > избавится от множественных проверок


Автор: Cepheus 13.03.12, 05:23
Здравствуйте,
есть 2 таблицы
category(id,titel,parent_id)
pages(id,titel,category_id)

нужно вывести на странице категории верхнего уровня(parent_id=nil), затем по переходу категории выводить под категории и страницы принадлежащие ей, в контроллере в методе list
делаю
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    def list
    if params[:category]==nil
    @top_cat= Category.find_all_by_parent_id(nil)
    end
    if params[:category]!=nil
    @cat = Category.find_all_by_parent_id(params[:category])
    @pages = Pages.find_all_by_category_id(params[:category])
    end
    end


соответственно во вьюхе нужно все это дело вывести
приходится тоже делать всякие проверки, так как еще категории и страницы выводятся в разные таблицы, и если к примеру страниц не существует у категории, то и таблицу не выводить, уж оч много проверок всяких
как тут можно это все оптимизировать. Ух как описал=))))

Автор: LeXuS 24.03.12, 21:50
Какой ужас%)
Почитай доку по поводу того что такое has_many, belongs_to и т.д.

Автор: Мохнатый 28.03.12, 06:37
И что я сюда зашел :)

Автор: deil 03.04.12, 13:30
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    def list
      @categories = Category.all :conditions => {:category_id => params[:category_id] }
      @pages = Page.all :conditions => {:category_id => params[:category_id] }
    end


Не?

Автор: LeXuS 03.04.12, 17:44
deil,
Ней смей так делать никогда:) Да и не в тему)

Подскажу по теме:
Используй гем https://github.com/collectiveidea/awesome_nested_set

Автор: Cepheus 13.04.12, 09:33
LeXuS и причем тут has_many, belongs_to, это связи, а мне нужно выводить полученный результат

Автор: LeXuS 14.04.12, 08:51
Цитата Cepheus @
LeXuS и причем тут has_many, belongs_to, это связи, а мне нужно выводить полученный результат

Ага=) Именно связи:) Почитай как реализовать вывод если связать так ;)

Автор: Cepheus 16.04.12, 04:55
Цитата LeXuS @
Ага=) Именно связи Почитай как реализовать вывод если связать так

да тут в другом вопрос(хотя про связи не отрицаю, может и имеют место быть тут, хотя и так все связанно), тут такое дело есть категории есть страницы, категории имеют вложенные категории, как обычно id через params приходит, категории имеют страницы, но могу и не иметь.
вот и получается такой алгоритм
1. если params =nil то вывести категории верхнего уровня, и посмотреть имеет ли он страницы если да то вывести эти страницы
2. если params!=nil то вывести категории с parent_id=params[:id] и так-же вывести страницы если имеются

вот и получается что и в контроллере и во вьюхе есть по пару проверок, хоть это и не много но как-то взгляр режет=)

Автор: Romtek 19.04.12, 08:10
Цитата Cepheus @
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    def list
    if params[:category]==nil
    @top_cat= Category.find_all_by_parent_id(nil)
    end
    if params[:category]!=nil
    @cat = Category.find_all_by_parent_id(params[:category])
    @pages = Pages.find_all_by_category_id(params[:category])
    end
    end

Первое, что бросается в глаза, так это излишняя проверка очевидного условия:
Если params[:category] сравнивается с null, то второй раз делать это бессмысленно, так как есть оператор else, который выберет оставшиеся варианты.

Исходя из описания задачи я понял, что отображаем страницы только для подкатегории, не включая вложенных подкатегорий. Поэтому nested sets отпадают.
  1. Опустив лишнее условие:
    <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      def list
        if params[:category] == nil
          @top_cat= Category.find_all_by_parent_id(nil)
        else
          @cat = Category.find_all_by_parent_id(params[:category])
          @pages = Pages.find_all_by_category_id(params[:category])
        end
      end
  2. Выражение
    @pages = Pages.find_all_by_category_id(params[:category])
    стоит переписать согласно
    Цитата http://www.nascenia.com/10-tips-to-boost-u...ls-application/
    6. Avoid dynamism

    Although find_by and find_all_by dynamic methods are really cool, the are also kind of slow because each one needs to run through method_missing and parse the filename against the list of columns in database table.
    так:
    Pages.all(:conditions => { :category_id => params[:category] })

    DRY №1
    <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      def list
        @cat = Category.all(:conditions => { :parent_id => params[:category] }) # выступает в роли подкатегорий данной категории или топ-категорий
        if params[:category]
          @pages = Pages.all(:conditions => { :category_id => params[:category] }) # страницы в данной подкатегории
        end
      end
  3. DRY №2
    <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      def list
        @cat = Category.all(:conditions => { :parent_id => params[:category] }) # выступает в роли подкатегорий данной категории или топ-категорий
        if params[:category] && Pages.count(:conditions => { :category_id => params[:category] }) > 0 # проверяем наличие параметра категории и количество страниц в ней
          @pages = Pages.all(:conditions => { :category_id => params[:category] }) # страницы в данной подкатегории
        else
          @pages = []
        end
      end
Я не знаю каким именно образом отображаются элементы на экране, поэтому возможны дополнительные изменения.
Может даже и как такие:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      @cat = Category.all(:conditions => { :parent_id => params[:category] }) # выступает в роли подкатегорий данной категории или топ-категорий
      if params[:category] # проверяем наличие параметра (под)категории
        @current_cat = Category.find(params[:category]) # находим заданную (под)категорию
        if @current_cat.pages.count > 0 # имеются ли в ней страницы
          @pages = @current_cat.pages.all # страницы в данной подкатегории
        else
          @current_cat = nil
          @pages = []
        end
      else
        @pages = []
      end

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)