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 |