
8 рдЕрдкреНрд░реИрд▓ рдХреЛ, рд░реЗрд▓реНрд╕ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмреНрд▓реЙрдЧ рдкрд░ рд░реВрдмреА 4.1 рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдПрдХ рд╕рдВрджреЗрд╢
рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ ред 5200 рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдлрд┐рдЯ рдмреИрдарддреА рд╣реИред
рд╣рдмреНрд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг
рдХреА рд╕рдореАрдХреНрд╖рд╛ рдереАред рдЖрдк
рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреНрд╕ рдФрд░
рдП рдЧрд╛рдЗрдб рднреА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рдФрд░ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд╕рдХреНрд░рд┐рдп рд░рд┐рдХреЙрд░реНрдб рдПрдирдо
class Conversation < ActiveRecord::Base enum status: [ :active, :archived ] end
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрд╕рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред рдмрд╣реБрдд рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ, рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
1. рдЧрдгрдирд╛ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд╛рдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рди рдорд╛рди рд▓реЗрдВ, рд▓реЗрдХрд┐рди рдирд╛рдо рд╕реЗ рдХреНрд╡рд┐рдпрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
create_table :conversations do |t| t.column :status, :integer end
рдЗрд╕реА рд╕рдордп, SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рднреА рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
where('status <> ? OR status <> ?', 0, 1)
where('status <> ? OR status <> ?', STATUS[:resolved], STATUS[:rejected])
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рдПрдХ рд╡рд░реНрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
2. рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреБрдЫ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд╛рдЧреВ ENUM рдкреНрд░рдХрд╛рд░ рдХрд╛
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЧрдгрдирд╛ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗред рдЗрд╕рд╕реЗ рднреНрд░рдо рдФрд░ рд╕рдВрдШрд░реНрд╖ рд╣реЛрдЧрд╛ред рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдорд╛рди рдирд╣реАрдВ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
class Bug < ActiveRecord::Base enum status: { new: 0,
рдЖрдк рдЗрд╕ рд╣реИрд╢ рдХреЛ
Bug.statuses
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
3. рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВред
рдЖрдк рдореМрдЬреВрджрд╛ рд╕реНрдХреЛрдк, рдПрд╕реЛрд╕рд┐рдПрд╢рди (рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ) рдХреЗ рдирд╛рдо рдФрд░ рд╕рдорд╛рди рдореЙрдбрд▓ (рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ) рдХреЗ рднреАрддрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЛ рдПрдирдо рд╡реИрд▓реНрдпреВ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
class Bug < ActiveRecord::Base enum status: [ :new, :closed ] enum code_review_status: [ :new, :finished ]
рдирдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдХреЛрдкреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░
рдЕрдм default_scope рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд╕рднреА рд╕реНрдХреЛрдк рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
class User < ActiveRecord::Base default_scope { where state: 'pending' } scope :active, -> { where state: 'active' } scope :inactive, -> { where state: 'inactive' } end
рдЕрдм
User.active
User.where(state: 'pending').where(state: 'active')
рдмрд░рд╛рдмрд░ рд╣реЛрдЧреА
User.where(state: 'pending').where(state: 'active')
ред рдпрд╛рдиреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рд╕реНрдХреЛрдкреНрд╕ рдЬрдВрдЬреАрд░реЛрдВ рд╕реЗ рдЬрдХрдбрд╝ рдХрд░ default_scope рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
unscope, except, rewhere
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ default_scope рд╕реЗ рдЧреБрдВрдЬрд╛рдЗрд╢ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ "рдЕрд▓рдЧ" рдХрд░рдирд╛
unscope, except, rewhere
:
class User < ActiveRecord::Base default_scope { where state: 'pending' } scope :active, -> { unscope(where: :state).where(state: 'active') } scope :inactive, -> { rewhere state: 'inactive' } end
рдЙрдиреНрдирдд CSRF рд╕реБрд░рдХреНрд╖рд╛ред
рдЕрдм, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, CSRF рд╕реБрд░рдХреНрд╖рд╛ .js рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред
рдПрдХ рдИрдорд╛рдирджрд╛рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рд▓рд╛рдЧреВ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд╣реА рдЬреЗрдПрд╕ рдХреЛрдб рдХреЗ рдЧрдарди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдЧрд┐рд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╕рд╛рди рд╣реИ
рдХреЗ рдмрджрд▓реЗ
post :create, format: :js
рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
xhr :post, :create, format: :js
рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрджрд┐ рдЖрдкрдХреЛ рдЕрднреА рднреА рддреГрддреАрдп-рдкрдХреНрд╖ рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ js рдХреЛрдб рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
skip_before_filter :verify_authenticity_token, only: [:stats, :visitor]
рдЦреИрд░, рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
response.headers['Access-Control-Allow-Origin'] = '*'
рдпрд╛, рдПрдХ рддрд╛рд░рд╛рдВрдХрди рдХреЗ рдмрдЬрд╛рдп, рдЙрд╕ рд╕рд╛рдЗрдЯ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред
рдЕрдм рддрдХ, рдпрд╣ рд╕рдм рдореБрдЭреЗ рдЦреБрдж рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░рдирд╛ рдерд╛ред рдмреЗрд╢рдХ, рд░реЗрд▓ 4.1 рдХреА рдирдИ рд░рд┐рд▓реАрдЬ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рд╣рдореЗрд╢рд╛ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИред
рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╢реЗрд╖ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреВрдВрдЧрд╛:
- рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд░реАрд▓реЛрдбрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
config/secrets.yml
ред - рдПрдХреНрд╢рди рдкреИрдХ рд╡реЗрд░рд┐рдПрдВрдЯ - рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ (рдЯреИрдмрд▓реЗрдЯ, рдбреЗрд╕реНрдХрдЯреЙрдк, рдлреЛрди, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрддреНрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
- рдПрдХреНрд╢рди рдореЗрд▓рд░ рдкреНрд░реАрд╡реНрдпреВ - рдореЗрд▓ рд╡реНрдпреВ рд░рддреНрди рдХрд╛ рд░реЗрд▓ рдореЗрдВ рдПрдХреАрдХрд░рдг - рдИрдореЗрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдпред
- рд╕рдВрджреЗрд╢ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ - рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдгред
- рдореЙрдбреНрдпреВрд▓ # рд╕рдВрдмрдВрдзрд┐рдд - рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╛рдЭрд╛рдХрд░рдг (рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЕрднреА рднреА рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдЬрдм рдореБрдЭреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ)
MySQL рд╕рд░реНрд╡рд░ 4.1 рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕рдорд░реНрдерди рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрджрд┐ рдореЗрд░реЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕ рджреБрд░реНрд▓рднрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред