На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > избавится от множественных проверок , rails
      Здравствуйте,
      есть 2 таблицы
      category(id,titel,parent_id)
      pages(id,titel,category_id)

      нужно вывести на странице категории верхнего уровня(parent_id=nil), затем по переходу категории выводить под категории и страницы принадлежащие ей, в контроллере в методе list
      делаю
      ExpandedWrap disabled
        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


      соответственно во вьюхе нужно все это дело вывести
      приходится тоже делать всякие проверки, так как еще категории и страницы выводятся в разные таблицы, и если к примеру страниц не существует у категории, то и таблицу не выводить, уж оч много проверок всяких
      как тут можно это все оптимизировать. Ух как описал=))))
        Какой ужас%)
        Почитай доку по поводу того что такое has_many, belongs_to и т.д.
          И что я сюда зашел :)
            ExpandedWrap disabled
              def list
                @categories = Category.all :conditions => {:category_id => params[:category_id] }
                @pages = Page.all :conditions => {:category_id => params[:category_id] }
              end


            Не?
              deil,
              Ней смей так делать никогда:) Да и не в тему)

              Подскажу по теме:
              Используй гем https://github.com/collectiveidea/awesome_nested_set
                LeXuS и причем тут has_many, belongs_to, это связи, а мне нужно выводить полученный результат
                  Цитата Cepheus @
                  LeXuS и причем тут has_many, belongs_to, это связи, а мне нужно выводить полученный результат

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

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

                    вот и получается что и в контроллере и во вьюхе есть по пару проверок, хоть это и не много но как-то взгляр режет=)
                      Цитата Cepheus @
                      ExpandedWrap disabled
                        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. Опустив лишнее условие:
                        ExpandedWrap disabled
                          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
                        ExpandedWrap disabled
                          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
                        ExpandedWrap disabled
                          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
                      Я не знаю каким именно образом отображаются элементы на экране, поэтому возможны дополнительные изменения.
                      Может даже и как такие:
                      ExpandedWrap disabled
                          @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
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0624 ]   [ 15 queries used ]   [ Generated: 19.03.24, 02:05 GMT ]