|
5 | 5 | module CanCan |
6 | 6 | module ModelAdapters |
7 | 7 | class ConditionsNormalizer |
8 | | - def self.normalize(model_class, rules) |
9 | | - rules.each { |rule| rule.conditions = normalize_conditions(model_class, rule.conditions) } |
10 | | - end |
| 8 | + class << self |
| 9 | + def normalize(model_class, rules) |
| 10 | + rules.each { |rule| rule.conditions = normalize_conditions(model_class, rule.conditions) } |
| 11 | + end |
11 | 12 |
|
12 | | - def self.normalize_conditions(model_class, conditions) |
13 | | - return conditions unless conditions.is_a? Hash |
| 13 | + def normalize_conditions(model_class, conditions) |
| 14 | + return conditions unless conditions.is_a? Hash |
14 | 15 |
|
15 | | - conditions.each_with_object({}) do |(key, value), result_hash| |
16 | | - if value.is_a? Hash |
17 | | - result_hash.merge!(calculate_result_hash(model_class, key, value)) |
18 | | - else |
19 | | - result_hash[key] = value |
| 16 | + conditions.each_with_object({}) do |(key, value), result_hash| |
| 17 | + if value.is_a? Hash |
| 18 | + result_hash.merge!(calculate_result_hash(model_class, key, value)) |
| 19 | + else |
| 20 | + result_hash[key] = value |
| 21 | + end |
| 22 | + result_hash |
20 | 23 | end |
21 | | - result_hash |
22 | 24 | end |
23 | | - end |
24 | 25 |
|
25 | | - private |
| 26 | + private |
26 | 27 |
|
27 | | - def self.calculate_result_hash(model_class, key, value) |
28 | | - reflection = model_class.reflect_on_association(key) |
29 | | - raise WrongAssociationName, "Association '#{key}' not defined in model '#{model_class.name}'" unless reflection |
| 28 | + def calculate_result_hash(model_class, key, value) |
| 29 | + reflection = model_class.reflect_on_association(key) |
| 30 | + unless reflection |
| 31 | + raise WrongAssociationName, "Association '#{key}' not defined in model '#{model_class.name}'" |
| 32 | + end |
| 33 | + |
| 34 | + if reflection.options[:through].present? |
| 35 | + key = reflection.options[:through] |
| 36 | + value = { reflection.source_reflection_name => value } |
| 37 | + reflection = model_class.reflect_on_association(key) |
| 38 | + end |
30 | 39 |
|
31 | | - if reflection.options[:through].present? |
32 | | - normalized_key = reflection.options[:through] |
33 | | - normalized_value = { reflection.source_reflection_name => value } |
34 | | - reflection_klass = model_class.reflect_on_association(normalized_key).klass.name.constantize |
35 | | - { normalized_key => normalize_conditions(reflection_klass, normalized_value) } |
36 | | - else |
37 | 40 | { key => normalize_conditions(reflection.klass.name.constantize, value) } |
38 | 41 | end |
39 | 42 | end |
|
0 commit comments