Дизайн панели инструментов направляющих: одно действие контроллера на отделение

В реляционной алгебре «Выделение» и «Проекция» - это разные операции, но SQL SELECT объединяет эти операции в одном выражении.

Select извлекает кортежи (строки) в отношении (таблице), для которых условие в разделе «предикат» (предложение WHERE) остается верным.

Проект извлекает указанные атрибуты (столбцы).

Следующий запрос SQL SELECT:

select field1,field2 from table1 where field1 = 'Value';

является комбинацией операций проекции и выделения реляционной алгебры.

12
задан Kevin Weil 26 May 2009 в 01:05
поделиться

4 ответа

Почему? Что бы вы ни делали, компилятор оптимизирует его для любой платформы, на которой вы в настоящее время компилируете.

Если вам нужно проверить, равно ли оно -1, используйте (x == -1), если вы хотите знать, меньше ли оно нуля , используйте его вместо этого. Напишите то, что вы прочитали бы вслух.

Такие крошечные вещи не сделают ничего быстрее, и вам следует беспокоиться о удобочитаемости и чистоте дизайна, а не о том, какая крошечная операция будет быстрее.

И даже если это не так. вносите какие-либо логические изменения, есть вероятность, что на вашей платформе оба будут работать за один цикл процессора .

они также не смогут влиять на окружающую страницу за пределами своего iframe.
  • может быть медленнее, в зависимости от времени пинга и т. д.
  • потенциальная ошибка эффективности n + 1, если у вас много таких модулей на странице
  • Версия 2 :

    Сделайте то же самое, используя вызовы JS для замены div частичным, а ля:

    <div id="placeholder">
    <%= update_page {|page| page['placeholder'].replace with some partial call here } %>
    

    То же, что и выше, за исключением:

    Pro:

    • не блокирует его в iframe, таким образом, разделяет Контекст JS и т. Д.
    • позволяет лучше обрабатывать случаи сбоя

    Недостаток:

    • требует JS и разделов-заполнителей; немного сложнее

    Версия 3:

    Вызов целой группы партиалов. Однако это становится сложным, когда вы говорите о таких вещах, как информационные панели, где отдельные модули имеют значительный объем логики настройки.

    Существуют различные способы обойти это, превратив эти вещи в «миксины» или тому подобное. , но ИМО они ' потому что это должно быть в файле / миксине библиотечного типа

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

    Мне пришлось сделать это один раз - в основном потому что рефакторинг, вызвавший это, был еще БОЛЬШЕ проблем - и я обещаю, что вы не захотите туда идти, если вам не нужно.

    Резюме

    ИМХО, лучший метод - это первый, если у вас есть достаточно сложные вещи, которые они требуют значительной настройки - простого iframe, который отображает модуль, передавая параметр, указывающий ему использовать ультраминималистичный макет (только заголовки CSS + JS), потому что он не отображается как его собственная страница.

    Это позволяет вам сохранять вещи полностью независимыми, функционировать более или менее так, как если бы они были совершенно обычными собственными контроллерами (кроме настройки компоновки), сохранять нормальные маршруты и т. Д.

    Если вам НЕ нужно значительную настройку, затем просто используйте партиалы и передайте все, что им нужно, в качестве локальной переменной. Это станет нестабильным, если вы столкнетесь с такими вещами, как n + 1 ошибок эффективности, хотя ...

    10
    ответ дан 2 December 2019 в 19:32
    поделиться

    Этого можно добиться, используя

    render_output = render: action => "graph2"

    Но лично я, вероятно, заключил бы код либо в общий помощник, либо написал бы свой собственный " lib "в каталоге lib, чтобы повторно использовать код с общим шаблоном. Помните, что до тех пор, пока вы не измените свой файл route.rb, любой открытый метод, определенный в

    / controller / action /: id

    , также не забудьте отключить макет для функции: layout => nil (или укажите в вверху макета контроллера "график",: except => ["graph2"]

    Ура

    Кристиан

    1
    ответ дан 2 December 2019 в 19:32
    поделиться

    Мне не известны какие-либо специальные приемы Rails для достижения этой цели без использования AJAX, как вы описали.

    Самый простой способ получить желаемую модульность - это поместить эти части кода контроллера в отдельные методы. (например, set_up_graph1_data , set_up_graph2_data и т. д.), которые вы просто вызываете из своего действия index , чтобы настроить переменные для представления.

    Вы можете поместите эти методы в ApplicationController , если вы хотите, чтобы они были доступны для нескольких контроллеров.

    В качестве примечания, на раннем этапе Rails использовал функцию под названием «компоненты», которая могла бы позволяют делать именно то, о чем вы просите, без использования AJAX. С вашей точки зрения, вы могли бы просто отрендерить другое действие контроллера, встроенное. Тем не мение,

    0
    ответ дан 2 December 2019 в 19:32
    поделиться

    почему бы вам не попробовать Apotomo, это виджеты с отслеживанием состояния для Rails:

    Учебное пособие по созданию простой информационной панели

    7
    ответ дан 2 December 2019 в 19:32
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: