Class: ActiveRecord::Associations::Builder::HasAndBelongsToMany
- Inherits:
-
Object
- Object
- ActiveRecord::Associations::Builder::HasAndBelongsToMany
- Defined in:
- lib/active_record/associations/builder/has_and_belongs_to_many.rb
Overview
:nodoc:
Instance Attribute Summary collapse
-
#association_name ⇒ Object
readonly
Returns the value of attribute association_name.
-
#lhs_model ⇒ Object
readonly
Returns the value of attribute lhs_model.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
Instance Method Summary collapse
-
#initialize(association_name, lhs_model, options) ⇒ HasAndBelongsToMany
constructor
A new instance of HasAndBelongsToMany.
- #middle_reflection(join_model) ⇒ Object
- #through_model ⇒ Object
Constructor Details
#initialize(association_name, lhs_model, options) ⇒ HasAndBelongsToMany
Returns a new instance of HasAndBelongsToMany.
7 8 9 10 11 |
# File 'lib/active_record/associations/builder/has_and_belongs_to_many.rb', line 7 def initialize(association_name, lhs_model, ) @association_name = association_name @lhs_model = lhs_model @options = end |
Instance Attribute Details
#association_name ⇒ Object (readonly)
Returns the value of attribute association_name.
5 6 7 |
# File 'lib/active_record/associations/builder/has_and_belongs_to_many.rb', line 5 def association_name @association_name end |
#lhs_model ⇒ Object (readonly)
Returns the value of attribute lhs_model.
5 6 7 |
# File 'lib/active_record/associations/builder/has_and_belongs_to_many.rb', line 5 def lhs_model @lhs_model end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
5 6 7 |
# File 'lib/active_record/associations/builder/has_and_belongs_to_many.rb', line 5 def @options end |
Instance Method Details
#middle_reflection(join_model) ⇒ Object
[View source]
59 60 61 62 63 64 65 66 67 68 |
# File 'lib/active_record/associations/builder/has_and_belongs_to_many.rb', line 59 def middle_reflection(join_model) middle_name = [lhs_model.name.downcase.pluralize, association_name.to_s].sort.join("_").gsub("::", "_").to_sym = join_model HasMany.create_reflection(lhs_model, middle_name, nil, ) end |
#through_model ⇒ Object
[View source]
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/active_record/associations/builder/has_and_belongs_to_many.rb', line 13 def through_model join_model = Class.new(ActiveRecord::Base) { class << self attr_accessor :left_model attr_accessor :name attr_accessor :table_name_resolver attr_accessor :left_reflection attr_accessor :right_reflection end @table_name = nil def self.table_name # Table name needs to be resolved lazily # because RHS class might not have been loaded @table_name ||= table_name_resolver.call end def self.compute_type(class_name) left_model.compute_type class_name end def self.add_left_association(name, ) belongs_to name, required: false, ** self.left_reflection = _reflect_on_association(name) end def self.add_right_association(name, ) rhs_name = name.to_s.singularize.to_sym belongs_to rhs_name, required: false, ** self.right_reflection = _reflect_on_association(rhs_name) end def self.retrieve_connection left_model.retrieve_connection end } join_model.name = "HABTM_#{association_name.to_s.camelize}" join_model.table_name_resolver = -> { table_name } join_model.left_model = lhs_model join_model.add_left_association :left_side, anonymous_class: lhs_model join_model.add_right_association association_name, () join_model end |