Вот erlang версия (~586 символов):
-module (xmas).
-export ([xmas/0]).
xmas() ->
W = ["twelve drummers drumming, ",
"eleven pipers piping, ",
"ten lords a-leaping, ",
"nine ladies dancing, ",
"eight maids a-milking, ",
"seven swans a-swimming, ",
"six geese a-laying, ",
"five gold rings, ",
"four calling birds, ",
"three french hens, ",
"two turtle doves, and ",
"a partridge in a pear tree."],
io:format(lists:foldl(
fun(X,Acc) -> Acc ++ X ++ "~n" end, "",
["On the " ++ day_str(Q) ++
" day of Christmas, my true love gave me " ++
lists:foldl(
fun(X,Acc)-> Acc++X end,
"", lists:nthtail(12-Q,W)) ||
Q <- lists:seq(1,12)]),[]).
day_str(Q) ->
case Q of
1 -> "1st";
2 -> "2nd";
3 -> "3rd";
N -> erlang:integer_to_list(N,10) ++ "th"
end.
Вот как это должно работать? Если Итак, почему они так спроектированы?
Да, фикстуры не используют обратные вызовы. Я предполагаю, что это из соображений производительности. Быстрее загружать данные прямо в базу данных без создания экземпляра модели.
Есть ли способ принудительного запуска обратных вызовов при загрузке приспособления?
Не знаю. У вас есть пара вариантов. Один из них - создать свои фикстуры, как если бы обратные вызовы уже были запущены. То есть вручную создать данные, которые будут выполнять обратные вызовы. Например, если у вас есть обратный вызов, который хэширует пароль пользователя, вам нужно будет хешировать пароль вручную, а затем сохранить этот хеш в приспособлении.
Второе решение (и настоятельно рекомендуется!) - использовать фабрики. Фабрики запускают обратные вызовы и позволяют использовать виртуальные атрибуты и т. Д. Это потому, что они каждый раз создают экземпляр модели. Одна из популярных жемчужин - Factory Girl . Еще можно попробовать Машинист . Я также создал серию Railscasts по этой теме.