рдореБрдЭреЗ рдбреЗрд▓рд┐рдЧреЗрдЯрдХреНрд▓рд╛рд╕ рд╕реЗ рдкреНрдпрд╛рд░ рд╣реЛ рдЧрдпрд╛

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

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ Person рд╡рд░реНрдЧ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рдмреЗрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ / рдпрд╛ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд▓реЗрдЦрдХ рдФрд░ рд╡рд┐рдХреНрд░реЗрддрд╛ рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ред

рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рд╢реБрд░реВ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
 class Person < ActiveRecord::Base has_many :articles #  has_many :comments, :through => :articles #  has_many :items #  has_many :transactions #  # ? def is_seller? items.present? end #    def amount_owed # =>   end # ? def is_author? articles.present? end #     ? def can_post_article_to_homepage? # =>       end end 

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

рдЗрд╕рдореЗрдВ рдПрдХ рдирдИ рдЪреБрдиреМрддреА рдЖ рд░рд╣реА рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рдХреНрд░реЗрддрд╛ / рд▓реЗрдЦрдХ рдФрд░ рдЦрд░реАрджрд╛рд░ рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдирд╛ рд╡рд░реНрдЧ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣:
 class Person < ActiveRecord::Base # ... has_many :purchased_items #   has_many :purchased_transactions #   # ? def is_buyer? purchased_items.present? end # ... end 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдиреЗ рдЦреБрд▓реЗрдкрди / рдирд┐рдХрдЯрддрд╛ (рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛рдкрди, рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдВрдж) рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рд╡рд░реНрдЧ рдмрджрд▓ рджрд┐рдпрд╛ред рджреВрд╕рд░реЗ, рдЬрдм рдмрд┐рдХреНрд░реА / рдЦрд░реАрджрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ ("рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмреЗрдЪрддрд╛ рд╣реИ", "рд╡рд┐рдХреНрд░реЗрддрд╛ рдЦрд░реАрджрд╛рд░ рдХреЛ рдмреЗрдЪрддрд╛ рд╣реИ") рддреЛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдХреЛрдб рд╕рд╛рдЭрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдПрдХ рдирдИ рдЪреБрдиреМрддреА рдЖ рдЧрдИ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рдВрдмрдВрдз рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ NoSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рдпрд╛ XML рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк ActiveRecord рдХреА рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реИрдВ, рдпреЗ рд╕рднреА has_many рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдХреЛ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд╕реНрдердЧрд┐рдд рд╣реИред

рдорд┐рд▓реЛ: рдбреЗрд▓рд┐рдЧреЗрдЯрдХреНрд▓рд╛рд╕

Person рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд░реНрдЧреЛрдВ рдХреА рдорджрдж рд╕реЗ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 #  class Person < ActiveRecord::Base end #  class Seller < DelegateClass(Person) delegate :id, :to => :__getobj__ #  def items Item.for_seller_id(id) end #  def transactions Transaction.for_seller_id(id) end # ? def is_seller? items.present? end #    def amount_owed # =>   end end #  class Author < DelegateClass(Person) delegate :id, :to => :__getobj__ #  def articles Article.for_author_id(id) end #  def comments Comment.for_author_id(id) end #  def is_author? articles.present? end #     ? def can_post_article_to_homepage? # =>       end end 

рдЗрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдХреЗ рдмрджрд▓реЗ
 person = Person.find(1) person.items 

рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 person = Person.find(1) seller = Seller.new(person) seller.items seller.first_name # =>  person.first_name 

рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХ рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
 #  class Buyer < DelegateClass(Person) delegate :id, :to => :__getobj__ #   def purchased_items Item.for_buyer_id(id) end # ? def is_buyer? purchased_items.present? end end 

рдЕрдм рдЕрдЧрд░ рдЖрдкрдХреЛ ActiveRecord рд╕реЗ Mongoid рддрдХ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдбреЗрд▓рд┐рдЧреЗрдЯ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдмреЗрд╢рдХ, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд░реНрдЧ рдПрдХ рдЪрд╛рдВрджреА рдХреА рдЧреЛрд▓реА рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, #reload :
 person = Person.find(1) seller = Seller.new(person) seller.class # => Seller seller.reload.class # => Person 

рдПрдХ рдФрд░ #id рдпрд╣ рд╣реИ рдХрд┐, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, #id рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд┐рд▓реНрдХреБрд▓ AcitveRecord#id рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ AcitveRecord#id рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 delegate :id, :to => :__getobj__ 

рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХреЛрдб рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИрдВред


рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ : рд╕рд░реНрдЧреЗрдИ рдкреЛрддрд╛рдкреЛрд╡ рдбреЗрд▓рд┐рдЧреЗрдЯрдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рдФрд░ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрддрд╛рддреЗ рд╣реИрдВ :
 require 'delegate' class Animal end class Dog < DelegateClass(Animal) end animal = Animal.new dog = Dog.new(animal) dog.eql?(dog) # => false, WTF? O_o 

рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ #eql? рдЖрдзрд╛рд░ рд╡рд╕реНрддреБ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, animal ) рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
 dog.eql?(animal) # => true 

рджреВрд╕рд░реА рдУрд░, #equal? рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рдирд╣реАрдВ:
 dog.equal?(dog) # => true dog.equal?(animal) # => false 

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


All Articles