Commit d3732796b6c6367d2059bbca4dcf70ca043bfed5
1 parent
65cdb388
Exists in
master
Do not store serialized objects in target_data
Showing
6 changed files
with
60 additions
and
4 deletions
Show diff stats
| @@ -0,0 +1,27 @@ | @@ -0,0 +1,27 @@ | ||
| 1 | +class CleanTargetDataColumn < ActiveRecord::Migration | ||
| 2 | + | ||
| 3 | + def up | ||
| 4 | + models = {'article' => 'Article', 'comment' => 'Comment', 'vote' => 'Vote', | ||
| 5 | + 'friendship' => 'Friendship', 'profile' => 'Profile', | ||
| 6 | + 'articlefollower' => 'ArticleFollower'} | ||
| 7 | + | ||
| 8 | + Merit::Action.where("target_model NOT IN (?)", models.keys).find_each do |action| | ||
| 9 | + next if action.target_data.blank? | ||
| 10 | + obj = YAML.load(action.target_data) rescue nil | ||
| 11 | + unless obj.nil? | ||
| 12 | + action.update_attribute(:target_model, obj.class.respond_to?(:base_class) ? obj.class.base_class.name : obj.class.name) | ||
| 13 | + end | ||
| 14 | + end | ||
| 15 | + | ||
| 16 | + models.each do |old_name, new_name| | ||
| 17 | + Merit::Action.where(target_model: old_name).update_all(target_model: new_name) | ||
| 18 | + end | ||
| 19 | + | ||
| 20 | + Merit::Action.update_all(target_data: nil) | ||
| 21 | + end | ||
| 22 | + | ||
| 23 | + def down | ||
| 24 | + puts "Warning: cannot restore target_data" | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | +end |
lib/merit_ext.rb
| 1 | require 'merit/badge_ext' | 1 | require 'merit/badge_ext' |
| 2 | require 'merit/sash' | 2 | require 'merit/sash' |
| 3 | require 'merit/badges_sash' | 3 | require 'merit/badges_sash' |
| 4 | +require 'merit/action' | ||
| 4 | 5 | ||
| 5 | module Merit | 6 | module Merit |
| 6 | 7 | ||
| @@ -40,6 +41,16 @@ module Merit | @@ -40,6 +41,16 @@ module Merit | ||
| 40 | end | 41 | end |
| 41 | end | 42 | end |
| 42 | 43 | ||
| 44 | + class Action | ||
| 45 | + def target_obj | ||
| 46 | + target_model.constantize.find_by_id(target_id) | ||
| 47 | + end | ||
| 48 | + | ||
| 49 | + def rules_matcher | ||
| 50 | + @rules_matcher ||= ::Merit::RulesMatcher.new(target_model.downcase, action_method) | ||
| 51 | + end | ||
| 52 | + end | ||
| 53 | + | ||
| 43 | module ClassMethods | 54 | module ClassMethods |
| 44 | 55 | ||
| 45 | def has_merit_actions(options = {}) | 56 | def has_merit_actions(options = {}) |
| @@ -64,9 +75,8 @@ module Merit | @@ -64,9 +75,8 @@ module Merit | ||
| 64 | :user_id => user ? user.id : nil, | 75 | :user_id => user ? user.id : nil, |
| 65 | :action_method => action, | 76 | :action_method => action, |
| 66 | :had_errors => self.errors.present?, | 77 | :had_errors => self.errors.present?, |
| 67 | - :target_model => self.class.base_class.name.downcase, | ||
| 68 | - :target_id => self.id, | ||
| 69 | - :target_data => self.to_yaml | 78 | + :target_model => self.class.base_class.name, |
| 79 | + :target_id => self.id | ||
| 70 | }) | 80 | }) |
| 71 | action.check_all_rules | 81 | action.check_all_rules |
| 72 | action | 82 | action |
script/check_merit_actions_vs_points.rb
| @@ -17,7 +17,9 @@ class ProcessObserver | @@ -17,7 +17,9 @@ class ProcessObserver | ||
| 17 | merit = changed_data[:merit_object] | 17 | merit = changed_data[:merit_object] |
| 18 | if merit.kind_of?(Merit::Score::Point) | 18 | if merit.kind_of?(Merit::Score::Point) |
| 19 | action = Merit::Action.find(changed_data[:merit_action_id]) | 19 | action = Merit::Action.find(changed_data[:merit_action_id]) |
| 20 | - new_date = YAML.load(action.target_data).created_at | 20 | + model = action.target_obj |
| 21 | + return if model.nil? | ||
| 22 | + new_date = model.created_at | ||
| 21 | action.update_attribute(:created_at, new_date) | 23 | action.update_attribute(:created_at, new_date) |
| 22 | merit.update_attribute(:created_at, new_date) | 24 | merit.update_attribute(:created_at, new_date) |
| 23 | end | 25 | end |
script/process_merit_rules.rb
| @@ -6,6 +6,8 @@ class ProcessObserver | @@ -6,6 +6,8 @@ class ProcessObserver | ||
| 6 | merit = changed_data[:merit_object] | 6 | merit = changed_data[:merit_object] |
| 7 | if merit.kind_of?(Merit::Score::Point) | 7 | if merit.kind_of?(Merit::Score::Point) |
| 8 | action = Merit::Action.find(changed_data[:merit_action_id]) | 8 | action = Merit::Action.find(changed_data[:merit_action_id]) |
| 9 | + model = action.target_obj | ||
| 10 | + return if model.nil? | ||
| 9 | new_date = YAML.load(action.target_data).created_at | 11 | new_date = YAML.load(action.target_data).created_at |
| 10 | action.update_attribute(:created_at, new_date) | 12 | action.update_attribute(:created_at, new_date) |
| 11 | merit.update_attribute(:created_at, new_date) | 13 | merit.update_attribute(:created_at, new_date) |
test/unit/article_test.rb
| @@ -209,4 +209,11 @@ class ArticleTest < ActiveSupport::TestCase | @@ -209,4 +209,11 @@ class ArticleTest < ActiveSupport::TestCase | ||
| 209 | assert_equal [], person.badges | 209 | assert_equal [], person.badges |
| 210 | end | 210 | end |
| 211 | 211 | ||
| 212 | + should 'restore article object from action' do | ||
| 213 | + create_point_rule_definition('article_author') | ||
| 214 | + article = create(TextArticle, :profile_id => person.id, :author => person) | ||
| 215 | + assert_equal 1, person.score_points.count | ||
| 216 | + assert_equal article, person.score_points.first.action.target_obj | ||
| 217 | + end | ||
| 218 | + | ||
| 212 | end | 219 | end |
test/unit/merit_ext_test.rb
| @@ -24,4 +24,12 @@ class MeritExtTest < ActiveSupport::TestCase | @@ -24,4 +24,12 @@ class MeritExtTest < ActiveSupport::TestCase | ||
| 24 | assert !point.undo_rule? | 24 | assert !point.undo_rule? |
| 25 | end | 25 | end |
| 26 | 26 | ||
| 27 | + should 'return target object associated to the merit action' do | ||
| 28 | + article = fast_create(Article) | ||
| 29 | + action = Merit::Action.new | ||
| 30 | + action.target_model = article.class.base_class.name | ||
| 31 | + action.target_id = article.id | ||
| 32 | + assert_equal article, action.target_obj | ||
| 33 | + end | ||
| 34 | + | ||
| 27 | end | 35 | end |