Class: RailsBestPractices::Reviews::UseModelAssociationReview

Inherits:
Review show all
Defined in:
lib/rails_best_practices/reviews/use_model_association_review.rb

Overview

review a controller file to make sure to use model association instead of foreign key id assignment.

See the best practice details here rails-bestpractices.com/posts/2-use-model-association.

Implementation:

Review process:

check model define nodes in all controller files,
if there is an attribute assignment node with message xxx_id=,
and after it, there is a call node with message :save or :save!,
and the subjects of attribute assignment node and call node are the same,
then model association should be used instead of xxx_id assignment.

Constant Summary

Constants inherited from Core::Check

Core::Check::CONTROLLER_FILES, Core::Check::HELPER_FILES, Core::Check::MAILER_FILES, Core::Check::MIGRATION_FILES, Core::Check::MODEL_FILES, Core::Check::NODE_TYPES, Core::Check::PARTIAL_VIEW_FILES, Core::Check::ROUTE_FILE, Core::Check::SCHEMA_FILE, Core::Check::VIEW_FILES

Instance Attribute Summary

Attributes inherited from Core::Check

#errors

Instance Method Summary collapse

Methods inherited from Review

#equal?, #model_associations, #model_attributes, #models, #remember_variable_use_count, #reset_variable_use_count, #variable, #variable_use_count

Methods inherited from Core::Check

#add_error, #initialize, #method_missing, #node_end, #node_start

Constructor Details

This class inherits a constructor from RailsBestPractices::Core::Check

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RailsBestPractices::Core::Check

Instance Method Details

#interesting_filesObject



27
28
29
# File 'lib/rails_best_practices/reviews/use_model_association_review.rb', line 27

def interesting_files
  CONTROLLER_FILES
end

#interesting_nodesObject



23
24
25
# File 'lib/rails_best_practices/reviews/use_model_association_review.rb', line 23

def interesting_nodes
  [:defn]
end

#start_defn(node) ⇒ Object

check method define nodes to see if there are some attribute assignments that can use model association instead.

it will check attribute assignment node with message xxx_id=, and call node with message :save or :save!

  1. if there is an attribute assignment node with message xxx_id=, then remember the subject of attribute assignment node.

  2. after assignment, if there is a call node with message :save or :save!, and the subject of call node is one of the subject of attribute assignment node, then the attribute assignment should be replaced by using model association.



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/rails_best_practices/reviews/use_model_association_review.rb', line 40

def start_defn(node)
  @attrasgns = {}
  node.recursive_children do |child|
    case child.node_type
    when :attrasgn
      attribute_assignment(child)
    when :call
      call_assignment(child)
    else
    end
  end
  @attrasgns = nil
end

#urlObject



19
20
21
# File 'lib/rails_best_practices/reviews/use_model_association_review.rb', line 19

def url
  "http://rails-bestpractices.com/posts/2-use-model-association"
end