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 @@ |
| 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 | 1 | require 'merit/badge_ext' |
| 2 | 2 | require 'merit/sash' |
| 3 | 3 | require 'merit/badges_sash' |
| 4 | +require 'merit/action' | |
| 4 | 5 | |
| 5 | 6 | module Merit |
| 6 | 7 | |
| ... | ... | @@ -40,6 +41,16 @@ module Merit |
| 40 | 41 | end |
| 41 | 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 | 54 | module ClassMethods |
| 44 | 55 | |
| 45 | 56 | def has_merit_actions(options = {}) |
| ... | ... | @@ -64,9 +75,8 @@ module Merit |
| 64 | 75 | :user_id => user ? user.id : nil, |
| 65 | 76 | :action_method => action, |
| 66 | 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 | 81 | action.check_all_rules |
| 72 | 82 | action | ... | ... |
script/check_merit_actions_vs_points.rb
| ... | ... | @@ -17,7 +17,9 @@ class ProcessObserver |
| 17 | 17 | merit = changed_data[:merit_object] |
| 18 | 18 | if merit.kind_of?(Merit::Score::Point) |
| 19 | 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 | 23 | action.update_attribute(:created_at, new_date) |
| 22 | 24 | merit.update_attribute(:created_at, new_date) |
| 23 | 25 | end | ... | ... |
script/process_merit_rules.rb
| ... | ... | @@ -6,6 +6,8 @@ class ProcessObserver |
| 6 | 6 | merit = changed_data[:merit_object] |
| 7 | 7 | if merit.kind_of?(Merit::Score::Point) |
| 8 | 8 | action = Merit::Action.find(changed_data[:merit_action_id]) |
| 9 | + model = action.target_obj | |
| 10 | + return if model.nil? | |
| 9 | 11 | new_date = YAML.load(action.target_data).created_at |
| 10 | 12 | action.update_attribute(:created_at, new_date) |
| 11 | 13 | merit.update_attribute(:created_at, new_date) | ... | ... |
test/unit/article_test.rb
| ... | ... | @@ -209,4 +209,11 @@ class ArticleTest < ActiveSupport::TestCase |
| 209 | 209 | assert_equal [], person.badges |
| 210 | 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 | 219 | end | ... | ... |
test/unit/merit_ext_test.rb
| ... | ... | @@ -24,4 +24,12 @@ class MeritExtTest < ActiveSupport::TestCase |
| 24 | 24 | assert !point.undo_rule? |
| 25 | 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 | 35 | end | ... | ... |