has_many: through => рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВ?

рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдЖрдк рджреЛ рдореЙрдбрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдХрдИ-рд╕реЗ-рдХрдИ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рдирд╡рддрд╛ рдХрд╛ рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╣рд┐рд╕реНрд╕рд╛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде has_many рд╡рд┐рдзрд┐ :through => :join_model_name ред рджреЛ ActiveRecord рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмреАрдЪ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдмрдВрдз рдПрдХ ActiveRecord рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред

рдФрд░ рдпрд╣ рдЕрджреНрднреБрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреНрд╡рд╛рдЗрди-рдЯреЗрдмрд▓ рдореЗрдВ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧреА (рддрдерд╛рдХрдерд┐рдд "рдЕрддрд┐рд░рд┐рдХреНрдд") рдлрд╝реАрд▓реНрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рднрд╛рдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рд╕реНрдХреНрд░реЗрдВрдХреЛрд╕реНрдЯ рдФрд░ рдХрд┐рддрд╛рдмреЗрдВ, рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдЪреНрдЫреЗрдж рдФрд░ рд╢реНрд░реЗрдгреА рдореЙрдбрд▓ рджреЛрд╕реНрдд рд╣реИрдВред рдмреЗрд╢рдХ, рдПрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рдирд╛рдо рд╡рд░реНрдЧреАрдХрд░рдг рдпрд╛ ArticleCategorization рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рднреАрдЦ рдорд╛рдБрдЧрддрд╛ рд╣реИред

has_many рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ - рд▓реЗрдЦ рдФрд░ рд╢реНрд░реЗрдгреА , рдФрд░ рд╣рдо рдПрдХ рдПрдЖрд░-рдСрдмреНрдЬреЗрдХреНрдЯ (рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ) рдвреВрдВрдврдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдмрдВрдз рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╢реБрджреНрдз рд╣реГрджрдп рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рд▓реЗрдЦрдХ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ:

 relations = article.article_categorizations.find_by_category_id(category) 


рдЬреАрд╡рди рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдореЙрдбрд▓ рдореЗрдВ рдЕрдХреНрд╕рд░ рд▓рдВрдмреЗ рдпреМрдЧрд┐рдХ рдирд╛рдо рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛ рдореЙрдбрд▓ рдХреЗ рдмреАрдЪ рдРрд╕рд╛ рд╕рдВрдмрдВрдз рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдпрд╛рддрдирд╛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдЕрдиреБрдЪреНрдЫреЗрдж рдФрд░ рд╢реНрд░реЗрдгреА рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рдФрд░ рд╕рдореБрджрд╛рдп , рдпрд╛ Preorder рдФрд░ CustomerNotification рд╣реИрдВ ред рдмрд╛рдзреНрдпрдХрд╛рд░реА рдореЙрдбрд▓ рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рд╕рдВрднрд╡ рд╡рд┐рдХрд▓реНрдкред


рдЗрд╕рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЕрдкрдиреЗ рдирд╛рдо рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рддрд╛рдХрд┐ рдзреНрдпрд╛рди рдореЗрдВ рди рд░рдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЪреБрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ:

1) FirstmodelSecondmodelRelation : ArticleCategoryRelation, UserGroupCommunityRelation рдпрд╛
2) рдлрд░реНрд╕реНрдЯрдореЙрдбрд▓рд╡реАрд╕ рд╕реЗрдВрдХрдВрдбрдореЙрдбрд▓ : рдЖрд░реНрдЯрд┐рдХрд▓рд╢реНрд░реЗрдгреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд╕рдореВрд╣рд╕реБрд╡рд┐рдзрд╛
3) ...

рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдордиреЗ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рд╣реИред рдЕрдм рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдореЙрдбрд▓ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ:

 preorder, message = Preorder.first, CustomerNotification.first relations = preorder.preorder_customer_notification_relations.find_by_customer_notification_id(message) 

рдпрд╣реА рд╣реИ, "рдкреБрд╕реНрддрдХ рд╕реЗ рднрд┐рдиреНрди" рдмрд╣реБрдд рд╣реА рдХреНрд░рд┐рдпрд╛рддреНрдордХ рджрд┐рдЦрддрд╛ рд╣реИред рдФрд░ рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

 preorder.relation_to(message) #      =>   PreorderCustomerNotificationRelation preorder.relations_to(message) #  ,  join-    =>   ActiveRecord::Relation 


рдЗрд╕реА рддрд░рд╣, рдпрд╣ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ, рд╕рдордорд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

 message.relations_to(preorder).where(:extra_field => "value") 


рд░реЗрд▓ рдореЗрдВ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд▓рд╛рдЧреВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ: рдЙрдирдХреЗ рдирд╛рдо рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдЯреЗрдмрд▓ рдХрд╛ рд╕рдВрдХреЗрдд рднреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рджреЛ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬрд┐рддрдиреА рдЪрд╛рд╣реЗрдВ рдЙрддрдиреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рд▓рд┐рдВрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реЗ рдЦреЛрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? - рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдФрд░ рдЙрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рд╣реИред

рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрднрд╡ рдмрддрд╛рддрд╛ рд╣реИ:
1) рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рд╕реА рднреА рджреЛ рдореЙрдбрд▓ рдХреЗ рдмреАрдЪ рдХреЗрд╡рд▓ рдПрдХ рдЬреЙрдЗрди-рдореЙрдбрд▓ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
2) рдЗрд╕рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдХреНрд╕рд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдг рд╣реИрдВред
3) рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓реЛрдВ рдХреЗ рд▓рдВрдмреЗ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ - рдЕрдЧрд░ рд╡реЗ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реА рд░реЗрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ:

/lib/ext/active_record/base.rb ActiveRecord :: рдмреЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реА рд╣реИ
 module MyExtensions module ActiveRecord module Base #   ,  has_many->through #    ActiveRecord::Relation  nil def relations_to(target) return nil unless target.kind_of? ::ActiveRecord::Base reflection = self.class.reflections.find do |r| r[1].instance_of? ::ActiveRecord::Reflection::ThroughReflection and r[1].klass == target.class end.at 1 rescue nil #    Array return nil unless reflection self.send(reflection.through_reflection.name).where(reflection.foreign_key.to_sym => target.id) end def relation_to(target) rels = relations_to(target) if rels.instance_of? ::ActiveRecord::Relation return (rels.count > 0) ? rels.first : nil end rels end end end end class ActiveRecord::Base include MyExtensions::ActiveRecord::Base end 


/config/initializers/ext.rb
 # Load extensions to existing classes. Dir["lib/ext/**/*.rb"].each do |fn| require File.expand_path( fn ) end 


рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрдзрди рдФрд░ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦреБрд╢реА рд╣реЛрдЧреА рдЬреЛ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдореЗрдВ рднреА рдЦреБрд╢реА рд╣реЛрдЧреА "рдкреНрд░рд┐рдп, рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ, рдпрд╣ рдХрд░реЗрдВ: ...", рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реА рдпреЛрдЬрдирд╛ рдПрдХ рд╕рджреА рдЬреАрдиреЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреА рд╣реИ :)

Source: https://habr.com/ru/post/In130301/


All Articles