Rails: ActiveRecord::StatementInvalid after_touch рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдПрд╕реЛрд╕рд┐рдПрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдЬрдире░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rails/rails

рд╣реЛрд▓рд╛

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

5.0.0.1 рд╕реЗ 5.0.1 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдХ ActiveRecord::StatementInvalid рдЕрдкрд╡рд╛рдж рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ActiveRecord mininum рдХрд░рддреЗ рд╕рдордп рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреНрд╡реЗрд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдФрд░ рдкреНрд░рддрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди maximum , average рдФрд░ рдЕрдиреНрдп - рдЧрдгрдирд╛ред рдЬрдм рддрдХ рдореИрдВрдиреЗ git bisect рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддрдм рддрдХ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рдХрд┐ рдХреМрди рд╕реА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдкреНрд░рддрд┐рдЧрдорди рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ https://github.com/rails/rails/pull/25976 рд╣реИ

рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдЦреЛрд▓ рд╕рдХреВрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдореБрдЭреЗ рдХрд╛рдлреА рд╕рдордп рд▓рдЧрд╛ рдФрд░ рдореИрдВ рдЕрднреА рднреА рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рдХрд┐ ActiveRecord::StatementInvalid рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЕрдЬреАрдм рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЬрдм рдореИрдВ http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Placing your callbacks after associations is usually a good practice. рдкрдврд╝рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЕрдкрдиреА рддрд░рдл рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рджреЗрдВред рдкрд╣рд▓реЗ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ, рдХреГрдкрдпрд╛ https://gist.github.com/yukideluxe/36b4092748310bc8ec020f5e4dad8ea9

  1. рдпрд╣ рддрднреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЙрд▓рдмреИрдХ has_many рдПрд╕реЛрд╕рд┐рдПрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рд╕реНрд╡рдд: рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
  2. рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдореЗрдВ, after_touch рдХреЙрд▓рдмреИрдХ рдЪрд▓рд╛рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рдЙрдард╛рдИ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрднреА рдЬрдм after_create рднреА рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛред after_create рдореЗрдВ SQL рдХреНрд╡реЗрд░реА SELECT MIN(`comments`.`id`) FROM `comments` WHERE `comments`.`post_id` IS NULL рд╣реИ рдореИрдВ рдЗрд╕реЗ before_create $ рдХреЗ рд▓рд┐рдП рд╕рдордЭреВрдВрдЧрд╛ рд▓реЗрдХрд┐рди after_create рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА post_id
  3. bound_attributes рдХреЗ comments рдПрд╕реЛрд╕рд┐рдПрд╢рди рдХреЗ ActiveRecord::Associations::CollectionProxy рдФрд░ рдЗрд╕рдХреЗ рджрд╛рдпрд░реЗ ActiveRecord::AssociationRelation рдЦрд╛рд▓реА рд╣реИрдВ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдПрд╕реЛрд╕рд┐рдПрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ foreign_key рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд░рд┐рд╢реНрддреЗ рдХрд╛
  4. рдпрд╣ sqlite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ !!! рд╕рднреА рдкреНрд░рд╢реНрди рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рджрд┐рдЦрддреЗ рд╣реИрдВред

рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдмрд╕ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдерд╛ https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_proxy.rb#L753 -L755 рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рднреА рд╕рд╣реЗрдЬрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреЙрд▓ рдЬреЛ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рднреА рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рдореБрджреНрджрд╛ рд╣реИ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ я╕П

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

рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо

рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЛ рдЪрд▓рд╛рдПрдБ https://gist.github.com/yukideluxe/36b4092748310bc8ec020f5e4dad8ea9

sqlite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

ruby test_case.rb

рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ

mysql2 . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

ARCONN=mysql2 ruby test_case.rb

рдЕрдкрд╡рд╛рдж рдЙрдард╛рддрд╛ рд╣реИ

ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1: SELECT MIN(`comments`.`id`) FROM `comments` WHERE `comments`.`post_id` =

рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реНрдХреНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

ARCONN=postgresql ruby test_case.rb

рдЕрдкрд╡рд╛рдж рдЙрдард╛рддрд╛ рд╣реИ

ActiveRecord::StatementInvalid: PG::ProtocolViolation: ERROR:  bind message supplies 0 parameters, but prepared statement "" requires 1
: SELECT MIN("comments"."id") FROM "comments" WHERE "comments"."post_id" = $1

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рднреА рд╣реЛ рд░рд╣реА рд╣реИ, рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ https://github.com/rails/rails/compare/master...yukideluxe :callbacks-calculation-bug

рд▓рдВрдмреА рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛! рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рд╕рдордЭрд╛рдпрд╛ред рдЕрдЧрд░ рдЖрдкрдХрд╛ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ! тЭдя╕П

With reproduction steps activerecord attached PR

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

#25877 рд╡рд┐рд▓рдп рдХреЗ рдмрд╛рдж рд╕реЗ рдмрдВрдж рд╣реБрдЖред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдкреБрд╖реНрдЯрд┐ рдХреА #25877 рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ @kamipo! рдореИрдВ рдЬрд▓реНрджреА рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ "рдЕрдиреБрд╢рдВрд╕рд┐рдд" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдкреАрдЖрд░ рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рдП! рдзрдиреНрдпрд╡рд╛рдж!

#25877 рд╡рд┐рд▓рдп рдХреЗ рдмрд╛рдж рд╕реЗ рдмрдВрдж рд╣реБрдЖред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

joevandyk picture joevandyk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kitlangton picture kitlangton  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ianloblaw picture ianloblaw  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kassiansun picture kassiansun  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vinay-mittal picture vinay-mittal  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ