Переменные экземпляра в расположении

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

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

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

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

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

7
задан puttputt 3 December 2009 в 03:43
поделиться

5 ответов

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

def MenuItem.all_for_menu
  @@all_for_menu ||= MenuItem.find(:all)  #returns value if exists, or initializes it
end 

, я могу вызвать MenuItem.all_for_menu в моем макете и получить все элементы меню. Когда вы когда-либо добавляете новый или редактируете его, вам придется сделать это недействительным.

Другой подход к кэшированию - поместить данные в частичную и кэшировать этот фрагмент с помощью стандартного вызова кеширования:

<% cache(:controller => "menu_items",
         :action => "list", 
         :action_suffix => "all_menu_items") do %>
  <%= render :partial => "menu", :collection => MenuItem.all_for_menu %>
<% end %>

Затем вы можете истечь этот фрагмент, позвонив по телефону:

expire_fragment(:controller => "menu_items", :action => "list", :action_suffix => "all_menu_items")
3
ответ дан 6 December 2019 в 19:37
поделиться

Кратчайшие решения от codegolf.com

Некоторое время назад на Code Golf было завершено соревнование « от римского к десятичному ». (Ну, на самом деле он все еще работает, потому что они никогда не заканчиваются.) Игрок в гольф на Perl по имени eyepopslikeamosquito решил выиграть все четыре языка (Perl, PHP, Python и Ruby), и он это сделал. Он написал увлекательную серию из четырех частей: « Поле для гольфа выглядит великолепно, я чувствую себя хорошо, мне нравятся мои шансы » ( часть II , часть III , часть IV ), описывающая его подходы к Perl Monks .

Вот его решения:

Ruby, 53 удара

n=1;$.+=n/2-n%n=10**(494254%C/9)%4999while C=getc;p$.

Perl, 58 штрихов

$\+=$z-2*$z%($z=10**(19&654115/ord)%1645)for<>=~/./g;print

Он также имеет 53-тактное решение, но, вероятно, сейчас оно не работает: (Этот ответ является копией + вставкой из аналогичного ответа, который я опубликовал на , этот вопрос )

Нормальное содержимое представления автоматически отображается в вызове yield без аргументов в макете . Но вы также можете вставить другое содержимое-заполнитель, используя yield с аргументом символа и указав этот контент из представления с помощью content_for .

app / views / layouts / posts_layout. html.erb

<html>
  <head>
    <title>My awesome site</title>
  </head>
  <body>
    <div id="someMenuStructureHere">
      <%= yield(:menu_items) %> <!-- display content passed from view for menu_items -->
    </div>
    <%= yield %> <!-- display main view content -->
  </body>
</html>

app / views / posts / index.html.erb

<%= content_for :menu_items, some_helper_to_generate_menu %>
<h1>Here is you page content</h1>
16
ответ дан 6 December 2019 в 19:37
поделиться

Любые переменные экземпляра, определенные в контроллерах, автоматически становятся доступными в ваших представлениях. Если вы ожидаете, что переменная экземпляра в вашем макете для всех действий, вы можете рассмотреть возможность определения переменной экземпляра в before_filter или инкапсуляции ее в методе контроллера и использования helper_method , чтобы сделать ее доступной в ваших представлениях.

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

Это действительно зависит от того, что вы хотите делать с моделью . Я просто угадаю, а вы скажете мне, что вам нужно другого, чтобы лучше понять, как это сделать. Этот код будет работать, только если ваша модель MenuItem имеет поле с именем name .

В контроллере:

# Use whatever action you are currently displaying
def index 
  @menu_items = MenuItem.all
end

В файле представления index.html.erb :

<ul id="menu">
<% @menu_items.each do |menu_item| %>
   <%= h menu_item.name %>
<% end %>
</ul>

Очевидно, если бы это было настоящее меню, там тоже были бы гиперссылки :)

-3
ответ дан 6 December 2019 в 19:37
поделиться

items_controller.rb (или что-то в этом роде)

def show
   @menu_item = MenuItem.find(params[:id])
end

В представлении show.html.erb :

<%= @menu_item.name %>
-3
ответ дан 6 December 2019 в 19:37
поделиться
Другие вопросы по тегам:

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