рельсы достижений - PullRequest
       27

рельсы достижений

2 голосов
/ 27 февраля 2012

Затем настал момент для реализации какого-то достижения в нашем веб-приложении. У меня была идея, более или менее похожая на иерархию, описанную в этом вопросе Как внедрить систему достижений в RoR .

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

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

Редактировать: конкретный вопрос

Я думал о моделировании класса достижений со списком условий, которые должны быть выполнены. Этот базовый класс Achievement будет иметь логическое значение, которое рекурсивно проверяет все условия на правильность. Условия тогда могут быть жестко закодированными классами. Затем системный администратор создает новый вид достижений с комбинациями атомных условий .

Мой страх - растущее число классов для атомных условий. Я не хочу иметь более 30 классов условий в проекте. Любой совет действительно приветствуется.

Редактировать: подробнее о реализации

Из ответа SpyrosP кажется хорошей идеей построить описанный DSL. Таким образом, достижения должны быть сохранены в базе данных. Сохраняя тот же пример:

comments :less_than => 10
check_comments
comments :more_or_equal => 100
award_hundred_comments_badge 

Для динамического создания достижений должна существовать таблица, в которой хранятся проверяемые условия:

Achievement
| id | name                |
| 1  | "Houndred Comments" |

Condition
| achievement_id | expression             |  
| 1              | some sort of condition |

1 Ответ

1 голос
/ 27 февраля 2012

Меня интересовала одна и та же идея, и некоторое время назад я читал разные вещи.Вероятно, лучший способ сделать это - использовать наблюдателей.Наблюдатель подобен стандартному фильтру (before_filter и тому подобное), но с некоторыми отличиями, такими как обработка возвращаемого значения и т. Д.

При этом, если ваша система действительно очень сложная, вы можете захотетьиспользовать плагин конечного автомата, например https://github.com/pluginaweek/state_machine.Однако я чувствую, что это слишком много для функциональности Достижения.

Если бы мне пришлось столкнуться со сложными сценариями Достижения, я бы, вероятно, создал бы простой DSL, который определяет поведение достижения.Что-то вроде:

for_achievement :hundred_comments do
  before_achievement :status => Comment, :lower_than => 100
  after_achievement :status => Comment, :more_or_equals => 100
end

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

Надеюсь, это немного поможет или, по крайней мере, даст вам некоторые идеи :)

РЕДАКТИРОВАТЬ: проще DSL

DSL может быть очень простым и выразительным, так что людям даже нравится писать сценарии с.Что-то вроде:

comments :less_than => 10
check_comments
comments :more_or_equal => 100
award_hundred_comments_badge

Это может быть легко сформировано, чтобы быть действительным сценарием достижения 100 комментариев.Давайте подумаем о сценарии, в котором пользователь получает значок, если он пригласил ровно 10 человек, женщин в пол.

invites :less_than => 10, gender :female
check_invites
invites :equals => 10, gender :female
award_women_invitations_badge

Теперь я думаю, что это очень просто написать даже для администраторов, у которых нетПодсказка о рубине, если вы объясните им основные вещи о DSL.Но если вы не хотите, чтобы они вступали в это, вы можете создать такую ​​форму:

Action Dropdown => [Comment, Invite, Post, ....]
Condition => [Equal, Less Than, More Than, ....]
Condition_Value => (TextBox to write value to)
CheckCondition => [Check Invitation Count, Check Messages Count, ....]
...