рд░реВрдмреА рдореЗрдВ рдкрдЯрд░рд┐рдпреЛрдВ рдкрд░ рдмрд╣реБрд░рдВрдЧреА рдХреНрд░реЙрд╕-рдХрдЯрд┐рдВрдЧ рд╕рдВрдШ

рдпрд╣ рд▓реЗрдЦ рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рдореЗрдВ рдХрдИ-рд╕реЗ-рдХрдИ рд░рд┐рд╢реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрд░реВрдкрддрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред

рдХрд╛рд░реНрдп


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдорд╛рд▓ рдкрд░рд┐рд╡рд╣рди рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдЗрд╕ рдкрд░рд┐рд╡рд╣рди рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ: рдЯреНрд░реЗрди, рд╣реЗрд▓реАрдХреЙрдкреНрдЯрд░, рдЯреНрд░рдХ рдФрд░ рдмрдЬрд░рд╛ред рдФрд░ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд╣рди рдХреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдмрд╕реНрддрд┐рдпреЛрдВ рддрдХ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЯреНрд░рдХ рд░реВрд╕ рдХреЗ рдордзреНрдп рднрд╛рдЧ рдореЗрдВ рд╕рд╡рд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рджрдХреНрд╖рд┐рдг рдореЗрдВ, рд╣реЗрд▓реАрдХреЙрдкреНрдЯрд░ рд╕рд╛рдЗрдмреЗрд░рд┐рдпрд╛ рдФрд░ рдХрд╛рдордЪрдЯрдХрд╛ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЯреНрд░реЗрдиреЗрдВ рдЖрдо рддреМрд░ рдкрд░ рд░реЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рд╡рд┐рдХрд╕рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╣рди рдХреЛ рдХреНрд░рдорд╢рдГ рдЙрд╕рдХреА рдХрдХреНрд╖рд╛: рдЯреНрд░реЗрди , рдХреЙрдкреНрдЯрд░ , рдЯреНрд░рдХ , рдЬрд╣рд╛рдЬ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдмрд╕реНрддрд┐рдпреЛрдВ (рд╢рд╣рд░реЛрдВ, рдХрд╕реНрдмреЛрдВ, рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╕реНрдЯреЗрд╢рдиреЛрдВ, рдпрд╣рд╛рдВ рд╣рдо рдЖрдХрд╛рд░ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рднреМрдЧреЛрд▓рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ), рдЬрд┐рдирд╕реЗ рдкрд░рд┐рд╡рд╣рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реНрдерд╛рди рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рд╢рд░реНрдд рд╣реИ: рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдЗрдХрд╛рдИ рдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд╣рди рдЗрдХрд╛рдИ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЗрд▓рд╛рдХреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреЗрд╡рд▓ рджреЛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐:
- рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рдиреАрдпрддрд╛ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд╣рди рдХреЗ рдПрдХ рдореЛрдб рд╕реЗ рдЬреБрдбрд╝реА рдереА, рдлрд┐рд░ рд╕рд╛рдзрд╛рд░рдг рдмрд╣реБрд░реВрдкреА рд╕рдВрдШреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛;
- рдкрд░рд┐рд╡рд╣рди рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдореЛрдб рдерд╛, рдлрд┐рд░ рдХрдИ-рд╕реЗ-рдХрдИ рд╕рдВрдШреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рддреАрд╕рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЙрдк-рдЕрдкрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдШреЛрд▓


рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╣реИ рдЪрд╛рд░ рд╕рд░реНрд╡рд┐рд╕ рдЯреНрд░рд╛рдВрд╕реЗрдЯрд┐рд╡ рдЯреЗрдмрд▓ рдмрдирд╛рдирд╛ рдЬреЛ рдмрд╕реНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╡рд╣рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдореЛрдб рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред
class Train < ActiveRecord::Base has_many :train_locations, dependent: :destroy has_many :locations, through: :train_locations end class TrainLocation < ActiveRecord::Base belongs_to :train belongs_to :location end 

рдкреВрд░рд╛ рдХреЛрдб рджреЗрдЦреЗрдВ

рдФрд░ рд╕реНрдерд╛рди рд╡рд░реНрдЧ, рдЬреЛ рдкрд░рд┐рд╡рд╣рди рдХреЗ рд╕рднреА 4 рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ
 class Location < ActiveRecord::Base has_many :train_locations, dependent: :destroy has_many :ship_locations, dependent: :destroy has_many :copter_locations, dependent: :destroy has_many :truck_locations, dependent: :destroy has_many :trains, :through => :train_locations has_many :ships, :through => :ship_locations has_many :copters, :through => :copter_locations has_many :trucks, :through => :truck_locations end 

рдЙрдлреНрдлреНрдл ... рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 9 рдЯреЗрдмрд▓, 9 рдореЙрдбрд▓ рдФрд░ рд╕рдЬрд╛рддреАрдп рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдирд┐рдХрд▓рд╛ред рдХреНрдпрд╛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ? рдФрд░ рдЕрдЧрд░ рдкрд░рд┐рд╡рд╣рди рдХреЗ 10 рдореЛрдб рд╣реИрдВ, рддреЛ 21 рдЯреЗрдмрд▓ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП 21 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдПрдХ рд╣реА рд╕рдХрд░реНрдордХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХреА рдЧрдИ?
рдЬрд▓реНрджреА рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛!

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрдгрдп


рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдмрдирд╛рдПрдВ:
 class CreateMoveableLocations < ActiveRecord::Migration def change create_table :moveable_locations do |t| t.references :location t.references :moveable, polymorphic: true t.timestamps end end end 

рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдВрдЧрдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░рд┐рд╡рд╣рди рдпреЛрдЧреНрдп рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

рдЕрдЧрд▓рд╛, рднрдВрдбрд╛рд░рдг рд╕рдВрдШреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:
 class MoveableLocation < ActiveRecord::Base belongs_to :location belongs_to :moveable, polymorphic: true end 

рд╣рдо рдкрд░рд┐рд╡рд╣рди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рддреЗ рд╣реИрдВ:
 class Train < ActiveRecord::Base has_many :moveable_locations, as: :moveable, dependent: :destroy has_many :locations, through: :moveable_locations end 

рдкреВрд░рд╛ рдХреЛрдб рджреЗрдЦреЗрдВ

рдпрд╣рд╛рдБ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдЯреНрд░реЗрди рд╡рд░реНрдЧ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдмрд╣реБрд░реВрдкреА рд╣реИред
рдФрд░ рд▓реЛрдХреЗрд╢рди рдХреЛ рдЫреЛрдЯрд╛ рдХрд░реЗрдВ
 class Location < ActiveRecord::Base has_many :moveable_locations, dependent: :destroy has_many :trains, :through => :moveable_locations has_many :ships, :through => :moveable_locations has_many :copters, :through => :moveable_locations has_many :trucks, :through => :moveable_locations end 

рд╣рдо рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ (рдЖрдЦрд┐рд░рдХрд╛рд░, рд╡реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдареАрдХ рд╣реИ?) рдФрд░ ... рд╡реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди


рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдЬрд╛рджреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдерд╛рди рд╡рд░реНрдЧ рдХреЛ рд╕рдВрдШрдЯрди (рдЯреНрд░реЗрди, рдЬрд╣рд╛рдЬ рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдЪрд▓ рд╕рдХрдиреЗ рдпреЛрдЧреНрдп рд╕реНрддрдВрдн рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ ред
 class Location < ActiveRecord::Base has_many :moveable_locations, dependent: :destroy with_options :through => :moveable_locations, :source => :moveable do |location| has_many :trains, source_type: 'Train' has_many :ships, source_type: 'Ship' has_many :copters, source_type: 'Copter' has_many :trucks, source_type: 'Truck' end end 

With_options рдмреНрд▓реЙрдХ рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ : =>: moveable_locations ,: source =>: рдкреНрд░рддреНрдпреЗрдХ рдПрд╕реЛрд╕рд┐рдПрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж рдЪрд▓ ред
source рдФрд░ source_type рд╡реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЬреЛ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рднреА рдореЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рд▓реЛрдХреЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдХрд╣рд╛ рдХрд┐ source_type рдХреНрд▓рд╛рд╕_name рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИ, source_type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдПрд╕реЛрд╕рд┐рдПрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) ред
рдЕрдм рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 train = Train.new train.locations << city1 train.locations << city2 train.locations << city3 copter = Copter.new copter.locations << city1 

рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐:
 big_city = Location.new big_city.trains << train1 big_city.trains << train2 big_city.copters << copter1 big_city.trucks << truck1 big_city.trucks << truck2 

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

рдкреБрдирд╢реНрдЪ:
рдкрд░рд┐рд╡рд╣рди рдХреЗ рд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рджреЛ рд▓рд╛рдЗрдиреЗрдВ:
  has_many :moveable_locations, as: :moveable, dependent: :destroy has_many :locations, through: :moveable_locations 

рд╕рднреА рдЪрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдо рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЖрдо рдкреНрд▓рдЧ-рдЗрди рдореЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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


All Articles