ActiveRecord рднрд╛рдбрд╝реЗ

рдЖрдЬ рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд░рд┐рдХреЙрд░реНрдб рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдЕрдкрдиреЗ рд╕реЗрдЯ рдХреЛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдХрд┐ рдореБрдЭреЗ рд░реВрдмреА рдХреЛ рд░реЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдпрд╛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдорд┐рд▓рд╛ред



Update_attributes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рддреНрдпрд╛рдкрди рдмрд╛рдпрдкрд╛рд╕

рдорд╛рдирдХ update_attributes рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ save_attributributors рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛

@user = User.find(params[:id]) @user.assign_attributes(:name, "") @user.save(validate: false) 


рдмреЗрд╢рдХ - рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рди рд▓реЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЕрдХреНрд╕рд░ :)

2 рдЕрд╕рдорд╛рди рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ

рдХрднреА-рдХрднреА рд╕рдорд╕реНрдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдПрдХ рдирдореВрдиреЗ рдХреЛ 2 рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕реНрдХреЛрдк рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 Article < ActiveRecord::Base scope :unchecked, where(:checked => false) #or this, apologies for somewhat unefficient, but you already seem to have several queries scope :unchecked2, lambda { |checked| where(["id not in (?)", checked.pluck(:id)]) } end 


рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рджреЛрдиреЛрдВ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

 Article.unchecked Article.unchecked2(@unchecked_articles) 


рд╕рд╛рд╣рд╕

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдкреНрд▓рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ

 Article.all.select(:title).map(&:title) 


рдпрд╛ рднреА

 Article.all.map(&:title) 


рддреЛ - рдкреНрд▓рдХ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ

 Article.all.pluck(:title) 


рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рддрдХ рдкрд╣реБрдВрдЪ

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

 class Art < ActiveRecord::Base end class Picture < Art end class PlainPicture < Picture end 


PlainPicture рд╕реЗ Art рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 @plain_pictures = PlainPicture.all @plain_pictures.map { |i| if i.class < Art then i.becomes(Art) else i end }.each do |pp| #do something with Art end 


first_or_create рдФрд░ first_or_initialize

рдПрдХ рдФрд░ рдмрдврд╝рд┐рдпрд╛ рддрд░реАрдХрд╛ рд╣реИ рдкрд╣рд▓реЗ_рд░_рдХреНрд░реАрдЯред рдпрд╣ рдирд╛рдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 Art.where(name: "Black square").first_or_create 


рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд▓реЙрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 Art.where(name: "Black square").first_or_create do |art| art.author = "Malevich" end 


рдФрд░ рдЕрдЧрд░ рдЖрдк рд╕рд╣реЗрдЬрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП first_or_initialize рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 @art = Art.where(name: "Black square").first_or_initialize 


scoped рдФрд░ рдХреЛрдИ рдирд╣реАрдВ

2 рдФрд░ рдЕрджреНрднреБрдд рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - scoped рдФрд░ рдХреЛрдИ рдирд╣реАрдВред рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ rails3 рдФрд░ rails4 рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд▓рдЧ рд╣реИред

 def filter(filter_name) case filter_name when :all scoped when :published where(:published => true) when :unpublished where(:published => false) else none end end 


рдЬрдм рдкреНрд░рдХрд╛рд╢рд┐рдд: рдФрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд: рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рд╕рдордЭреЗрдВрдЧреЗ, рддреЛ рд╡рд┐рдзрд┐ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╣рд╛рдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

Rails3 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реНрдХреЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдПрдХ рдЕрдирд╛рдо рдЧреБрдВрдЬрд╛рдЗрд╢ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрдЯрд┐рд▓ рдпреМрдЧрд┐рдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ rails4 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╕рдВрджреЗрд╢ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдкрджрд╛рд╡рдирдд рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Model.all рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред Rails3 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, Model.all рд░рд┐рдЯрд░реНрди рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ ActiveRecord :: Relation, рд▓реЗрдХрд┐рди Arrayред

рдХреЛрдИ рднреА рдирд╣реАрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд scoped рдХреЗ рд╕рдорд╛рди рд╣реИ :) рдпрд╣ рд╡рд┐рдзрд┐ рдЦрд╛рд▓реА ActiveRecord :: Relation рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ rails4 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╢реВрдиреНрдп рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд░реЗрд▓ 3 рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ:

 scope :none, where(:id => nil).where("id IS NOT ?", nil) 


рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рдореЗрдВ)

 class ActiveRecord::Base def self.none where(arel_table[:id].eq(nil).and(arel_table[:id].not_eq(nil))) end end 


find_each

рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП find_each рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдмреЗрд╢рдХ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирдореВрдирд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ

 Article.where(published: true).each do |article| #do something end 


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

 Article.where(published: true).find_each do |article| #do something end 


рдЬреЛ рдЫреЛрдЯреЗ рдирдореВрдиреЛрдВ рдореЗрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдордп рдореЗрдВ 1000 рдСрдмреНрдЬреЗрдХреНрдЯ) рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

to_sql рдФрд░ рд╕рдордЭрд╛рдПрдВ

рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рддрд░реАрдХреЗред

 Art.joins(:user).to_sql 


рдЖрдкрдХреЛ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд░рдЪрдирд╛ рдХрд░реЗрдЧрд╛, рдФрд░

 Art.joins(:user).explain 


рдЕрдиреБрд░реЛрдз рдкрд░ рддрдХрдиреАрдХреА рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛рдПрдВрдЧреЗ - рд╕рдордп, рдирдореВрдирд╛ рдЖрдХрд╛рд░ рдФрд░ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рдорд╛рддреНрд░рд╛ред

scoping

рдпрд╣ рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдЪрдпрди рдХреЗ рднреАрддрд░ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 Article.where(published: true).scoping do Article.first end 


рдЬреИрд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ

 SELECT * FROM articles WHERE published = true LIMIT 1 


рдорд░реНрдЬ

рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдзрд┐ рдЬреЛ рдЖрдкрдХреЛ рдХрдИ рдирдореВрдиреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 class Account < ActiveRecord::Base # ... # Returns all the accounts that have unread messages. def self.with_unread_messages joins(:messages).merge( Message.unread ) end end 


рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдЦрд╛рддреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдЕрдкрдард┐рдд рд╕рдВрджреЗрд╢ рд╣реИрдВред

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


All Articles