Меня интересовала одна и та же идея, и некоторое время назад я читал разные вещи.Вероятно, лучший способ сделать это - использовать наблюдателей.Наблюдатель подобен стандартному фильтру (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, ....]