рдмрдбрд╝реЗ ActiveRecord рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП 7 рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ

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

рдкрд░рд┐рдЪрдп


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

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

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

рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░реЗрд▓ рдореЗрдВ рдУрдУрдкреА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореИрдВ рдПрдХ рд╣реА рдмрд╛рдд рд╕реЛрдЪрддрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рд╕рдордп рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрд▓ рдмрд┐рд▓реНрдХреБрд▓ рдУрдУрдкреА рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкреВрд░реЗ рджреЛрд╖ рд░реЗрд▓ рд╕рдордЭреМрддреЗ, рдпрд╛ рдмрд▓реНрдХрд┐, ActiveRecord рдЬрдЯрд┐рд▓рддрд╛ рдкреНрд░рдмрдВрдзрди - рдореЙрдбрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдордЭреМрддреЛрдВ рдХреА рдХрдореА рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдФрд░ рдкреНрд░рдерд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЙрдбрд▓ рд╕реЗ рдорд┐рд╢реНрд░рдг рдХрд╛ рдЪрдпрди рди рдХрд░реЗрдВ


рдЖрдЗрдП рддреБрд░рдВрдд рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдмрдбрд╝реЗ рдореЙрдбрд▓ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЪрд┐рдВрддрд╛ рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рддрдм рдЙрд╕реА рдореЙрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд░рдЪрдирд╛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рдорд┐рд╢реНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЧрдВрджреЗ рдХрдорд░реЗ рдХреА рд╕рдлрд╛рдИ рдХрд░рдирд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдиреЛрдВ рдореЗрдВ рдХрдЪрд░рд╛ рдзрдХреНрдХрд╛ рджреЗрдирд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХреНрд▓реАрдирд░ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ "рдХреЛрдиреЛрдВ" рдореЙрдбрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХреА рд╕рдордЭ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдм рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!

refactorings


1. рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░реЗрдВ

рдПрдХ рд╡реИрд▓реНрдпреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд╣рд┐рдд рдореВрд▓реНрдп (рдпрд╛ рдорд╛рди) рджреНрд╡рд╛рд░рд╛ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдРрд╕реА рд╡рд╕реНрддреБрдПрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрддреА рд╣реИрдВред рддрд┐рдерд┐, URI рдФрд░ Pathname рд░реВрдмреА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди (рдФрд░ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ) рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ - рд╡реЗ рдорд╛рди рдЬреЛ рдбреЛрдореЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдореЙрдбрд▓ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

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

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

class Rating include Comparable def self.from_cost(cost) if cost <= 2 new("A") elsif cost <= 4 new("B") elsif cost <= 8 new("C") elsif cost <= 16 new("D") else new("F") end end def initialize(letter) @letter = letter end def better_than?(other) self > other end def <=>(other) other.to_s <=> to_s end def hash @letter.hash end def eql?(other) to_s == other.to_s end def to_s @letter.to_s end end 

рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд╕реНрдирд╛рдкрд╢реЙрдЯ рд╡рд░реНрдЧ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдкрдиреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд░реЗрдЯрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

 class ConstantSnapshot < ActiveRecord::Base # тАж def rating @rating ||= Rating.from_cost(cost) end end 

рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд╕реНрдирд╛рдкрд╢реЙрдЯ рд╡рд░реНрдЧ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдФрд░ рдлрд╛рдпрджреЗ рд╣реИрдВ:

2. рд╕реЗрд╡рд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЪрдпрди (рд╕реЗрд╡рд╛ рд╡рд╕реНрддреБрдПрдБ)

рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕рд░реНрд╡рд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдирдХреЗ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддреА рд╣реИрдВред рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ:

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ # рдкреНрд░рдорд╛рдгрд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ UserAuthenticator рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class UserAuthenticator def initialize(user) @user = user end def authenticate(unencrypted_password) return false unless @user if BCrypt::Password.new(unencrypted_password) == @user.password_digest @user else false end end end 


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, SessionController рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 class SessionsController < ApplicationController def create user = User.where(email: params[:email]).first if UserAuthenticator.new(user).authenticate(params[:password]) self.current_user = user redirect_to dashboard_path else flash[:alert] = "Login failed." render "new" end end end 

3. рдлреЙрд░реНрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЪрдпрди (рдлреЙрд░реНрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕)

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

 class Signup include Virtus extend ActiveModel::Naming include ActiveModel::Conversion include ActiveModel::Validations attr_reader :user attr_reader :company attribute :name, String attribute :company_name, String attribute :email, String validates :email, presence: true # тАж more validations тАж # Forms are never themselves persisted def persisted? false end def save if valid? persist! true else false end end private def persist! @company = Company.create!(name: company_name) @user = @company.users.create!(name: name, email: email) end end 


ActiveRecord рдХреЗ рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд░рддреНрди рдкреБрдгреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдкреНрд░рдкрддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИ:

 class SignupsController < ApplicationController def create @signup = Signup.new(params[:signup]) if @signup.save redirect_to dashboard_path else render "new" end end end 


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

4. рдХреНрд╡реЗрд░реА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛


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

 class AbandonedTrialQuery def initialize(relation = Account.scoped) @relation = relation end def find_each(&block) @relation. where(plan: nil, invites_count: 0). find_each(&block) end end 


рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрддреНрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 AbandonedTrialQuery.new.find_each do |account| account.send_offer_for_support end 


ActiveRecord :: Relation class рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:

 old_accounts = Account.where("created_at < ?", 1.month.ago) old_abandoned_trials = AbandonedTrialQuery.new(old_accounts) 


рдРрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдХреНрд╡реЗрд░реА рдХреНрд░рдо рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЪрдпрди рдХреЛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рдЬреЙрдЗрди-рдПрд╕ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП (рдПрди + 1 рдХреНрд╡реЗрд░реА рдЬреИрд╕реЗ рдмрдЧ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП) рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

5. рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреЗрдЦреЗрдВ

рдпрджрд┐ рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдореЗрдВ рдХреЛрдИ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдкреВрдЫреЗрдВ: "рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╛рдЬ-рдЪрд╛рд▓рд┐рдд, рддреЛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА?" рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рд╕рд╣рд╛рдпрдХ рдпрд╛ рдХрд┐рд╕реА рднреА рдмреЗрд╣рддрд░ рд╡рд╕реНрддреБ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

 class DonutChart def initialize(snapshot) @snapshot = snapshot end def cache_key @snapshot.id.to_s end def data # pull data from @snapshot and turn it into a JSON structure end end 

рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдИрдЖрд░рдмреА (рдпрд╛ рд╣рдореНрд▓ / рд╕реНрд▓рд┐рдо) рдкреИрдЯрд░реНрди рдХреЗ рдмреАрдЪ рдПрдХ-рд╕реЗ-рдПрдХ рд░рд┐рд╢реНрддреЗ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдЯреВ рд╕реНрдЯреЗрдк рд╡реНрдпреВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд░реЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

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

6. рдирд┐рдпрдо рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЪрдпрди (рдиреАрддрд┐ рд╡рд╕реНрддреБрдПрдБ)

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

 class ActiveUserPolicy def initialize(user) @user = user end def active? @user.email_confirmed? && @user.last_login_at > 14.days.ago end end 


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

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

7. рдбреЗрдХреЛрд░реЗрдЯрд┐рдВрдЧ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕

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

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

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдлреЗрд╕рдмреБрдХ рдХрдореЗрдВрдЯ рд▓реЙрдЬрд┐рдХ рдХреИрд╕реЗ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:

 class FacebookCommentNotifier def initialize(comment) @comment = comment end def save @comment.save && post_to_wall end private def post_to_wall Facebook.post(title: @comment.title, user: @comment.author) end end 


рдирд┐рдпрдВрддреНрд░рдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

 class CommentsController < ApplicationController def create @comment = FacebookCommentNotifier.new(Comment.new(params[:comment])) if @comment.save redirect_to blog_path, notice: "Your comment was posted." else render "new" end end end 


рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд╕реНрддреБрдУрдВ - рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд▓рдкреЗрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдХреЛрд░реЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕реА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдЯрд┐рдкреНрдкрдгреА рд╡рд╕реНрддреБред рд░реВрдмреА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


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

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

рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд░реНрдгрд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ, рдпреЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗрд╡рд▓ рдкреНрд▓реЗрди рдУрд▓реНрдб рд░реВрдмреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (PORO) рд╣реИрдВ, рдЬреЛ рд░реЗрд▓ рдореЗрдВ рдУрдУрдкреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

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


All Articles