рд╕рдЪреНрдЪреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╕рддреНрдпрд╛рдкрди

рд╣рд░ рд╣реИрдХрд░ рдЬрд┐рд╕рдиреЗ рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ , ORM ActiveRecord рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред рд╣рдо рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдорд╛рдиреНрдпрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН, рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди, рдФрд░ рдХреНрдпреЛрдВ database_validations рдордгрд┐ рдЖрдкрдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдИрдореЗрд▓ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╡рд╛рд▓рд╛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рд╣реИ, рдЕрд░реНрдерд╛рдд

class User < ApplicationRecord validates :email, uniqueness: true end 

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

 SELECT 1 FROM users WHERE email = $1 

рд╣рд░ рдмрд╛рд░ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:

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

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

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

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдордгрд┐ database_validations рдорджрдж рдХрд░реЗрдЧрд╛, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдФрд░ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЧрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдордгрд┐ рдХрд╛ рдореБрдЦреНрдп рдЕрд░реНрде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 def save(options = {}) ActiveRecord::Base.connection.transaction(requires_new: true) { super } rescue ActiveRecord::RecordNotUnique => e Helpers.handle_unique_error!(self, e) false end 


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

рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдордгрд┐ рдХрдо рд╕реЗ рдХрдо рджреЛ рдмрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдЧрд╛ред

рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬреИрд╕реЗ рдХрд┐ PostgreSQL , SQLite , MySQL рдФрд░ validates_uniqueness_of рдХреЗ рд╕рд╛рде рдмреИрдХрд╡рд░реНрдб рд╕рдВрдЧрддрддрд╛, validates_uniqueness_of рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВред

RSpec рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рдорд┐рд▓рд╛рди рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рднреА рдореМрдЬреВрдж рд╣реИ:

 specify do expect(described_class) .to validate_db_uniqueness_of(:field) .with_message('duplicate') .with_where('(some_field IS NULL)') .scoped_to(:another_field) .with_index(:unique_index) end 

рдПрдХ рдирдП рд╕рддреНрдпрд╛рдкрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдордгрд┐ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред

рдордгрд┐ рдХреЛ 50+ рдореЙрдбрд▓ рдХреЗ рдмреАрдЪ рдЕрджреНрд╡рд┐рддреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП 100+ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрди рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдордгрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреА рд░рд╛рдп рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрд┐рд╕реА рднреА рдпреЛрдЧрджрд╛рди рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

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


All Articles