ãã®ä»¶ãé¢é£ããPRãIssueãè¤æ°ãã£ã¦ã³ã¡ã³ãã忣ãã¦ããã人ã«èª¬æããã®ããããããã®ã§ããã°ã¨ãã¦ã¾ã¨ãããã®ã«ãªãã¾ããééããæè¦ãªã©ãã£ããã³ã¡ã³ããã ããï¼
追è¨(2023/08/02)
7-0-stableãã©ã³ãã«ä»åã®å¤æ´ãrevertããã³ããããå ¥ãã¾ãããæåãå¤ãã£ã¦å°ã£ã人ãåºãã®ã§ä¸åº¦å ã«æ»ãã¦ä»åãç´ãã«ããæ¹éã®ããã§ãã
7.0.7ããã¤ãªãªã¼ã¹ããããã¯ãããã¾ããããä»ã®ç¶æ ã§ãªãªã¼ã¹ãããã7.0.4ã®æ¯ãèãã«æ»ããã¨ã«ãªãã¾ãã7.0.5以éã®å¤æ´ã§å°ã£ã¦ãã人ã¯ä¸æ¦7-0-stableãæãããã«ããã¨è¯ãããããã¾ããã
æ¦è¦
- Railsã®7.0.4ã¨7.0.5以éã§ã¯has_oneé¢é£ãå®ç¾©ããã¨ãã«çæãããcreate_associationã¡ã½ããã®æåãéã
- create_associationã®æ¯ãèãããæ°ããé¢é£å ã®ã¬ã³ã¼ããä½ããã¨ããæåã ãã ã¨æã£ã¦ããã¨ã7.0.5以éã使ãããã«ã³ã¼ããä¿®æ£ããå¿ è¦ããããããããªã
åæ
- has_oneé¢é£ã§ããã§ã«é¢é£å ãæ°¸ç¶åããã¦ããã¨ãã«æ°ããé¢é£å ãä½ããã¨ããã¨ãæ¢åã®é¢é£å ã¯åé¤ããã*1
- åé¤ã®ããæ¹ã¯has_oneã®dependentãªãã·ã§ã³ã«ãã£ã¦æ±ºã¾ã*2
:nullifyããããã¯dependentãªãã·ã§ã³ãè¨å®ãã¦ããªãã¨ãã¯å¤é¨ãã¼ãNULLã«ãã¦update:destoryã®ã¨ãã¯destroyã¡ã½ããã§åé¤:deleteã®ã¨ãã¯deleteã¡ã½ããã§åé¤
ä¾ãã°æ¬¡ã®ã³ã¼ãã§ã®(1)~(3)ã®å ¨ã¦ã§ãæ¢åã®é¢é£å ã«ç´ã¥ãã¬ã³ã¼ããããã°ãããåé¤ãã¾ãã
class User < ApplicationRecord has_one :address, dependent: :destroy end class Address < ApplicationRecord belongs_to :user end user = User.find(42) user.address = Address.new # (1) user.create_address # (2) user.build_address # (3)
Rails7.0.4ã¾ã§ã®æå
ããã¾ã§ãcreate_associationã®æå㯠Improve singular association creation by lazaronixon · Pull Request #46386 · rails/rails ã§èª¬æãããããã«å¥ã ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§insertãã¦ããdeleteããã¨ããæåã§ããã
# begin transaction INSERT new_record; # commit transaction # begin transaction DELETE old_record; # commit transaction
ããã«ãå è¡ã®insert(saveã¡ã½ããçµç±)ãããªãã¼ã·ã§ã³ã¨ã©ã¼ãªã©ã§å¤±æãã¦ããå¾ç¶ã®deleteã¯å®è¡ããã¾ãããã®æåã«ãããæ¢åã®ã¬ã³ã¼ããããç¶æ ã§create_association!ãããéã«ããªãã¼ã·ã§ã³ã¨ã©ã¼ã«ãªã£ã¦ãæ¢åã®ã¬ã³ã¼ããåé¤ããããã¨ããä¸å ·åãããã¾ããã
é¢é£Issue: has_one association getting deleted on using create_association & validation fails · Issue #46737 · rails/rails
ä»ã«ããæ¬¡ã®ãããªæµãã§æ¢åã¬ã³ã¼ãã®åé¤ãå¹ããªããã¨ããåé¡ãããã¾ããã
- ããªãã¼ã·ã§ã³ãéã£ãéã¯æ°è¦ã«ã¬ã³ã¼ãã使ãã
- æ¬¡ã«æ¢åã®ã¬ã³ã¼ããåé¤ãã
- åé¤ããããã®æ¢åã®ã¬ã³ã¼ãã®åå¾ã¯has_oneé¢é£çµç±ã«ãªã
- has_oneé¢é£ã®order byãè¨å®ããã¦ããªãå ´å(has_oneã§order byè¨å®ãããã¨ã¯ã»ã¼ãªãã¨æãããã®ã§ãã»ã¨ãã©ã®ã±ã¼ã¹ã該å½ãã)ã§ç¨ã«ä½ã£ãã°ããã®ã¬ã³ã¼ããåå¾ãã¦ãã¾ã
- ãã®ä½ã£ãã°ããã®ã¬ã³ã¼ããåå¾ãããå ´åã¯åé¤ããã¬ã³ã¼ãããªãã¨ããæ±ãã«ãªã
- çµæã¨ãã¦ãåé¤ãå¹ããã¬ã³ã¼ãã2件以ä¸åå¨ãã
é¢é£Issue: Sometimes create_association does not delete existing records · Issue #47554 · rails/rails
Rails7.0.5以éã®æå
7.0.5ã§ã¯æ¬¡ã®ããã«åä¸ãã©ã³ã¶ã¯ã·ã§ã³ã§deleteãã¦ããinsertãããã¨ããæåã«å¤ããã¾ãããä¸è¨ã®ä¸å ·åã¯ã»ã¼è§£æ¶*3ããã¾ããã
# begin transaction DELETE old_record; INSERT new_record; # commit transaction
ãããããã¨ãã¨has_oneã®å¤é¨ãã¼ã«å¯¾ãã¦ã¦ãã¼ã¯å¶ç´ãããã¦ãããæ¢åã®ã¬ã³ã¼ããããã¨ãã«create_associationããã¨ããªãã¼ã·ã§ã³ã¨ã©ã¼ã¨ãããã¢ããªã±ã¼ã·ã§ã³ã«ã¨ã£ã¦ã¯ã³ã¼ãã®ä¿®æ£ãå¿ è¦ã«ãªãã¾ãã
ææ
7.0.5ã«ããã夿´ã¯ãåæãã®ç¯ã§èª¬æããæåã®æ´åæ§ãåãããã«å¿
è¦ãªä¿®æ£ã§ãã£ãã¨å人çã«æãã¦ãã¾ããã䏿¹ã§ãassociation=ãbuild_associationãcreate_associationããããæ¢åã®ã¬ã³ã¼ããåé¤ããããã¨ããã®ã¯ç¥ããªã人ã«ã¨ã£ã¦ã¯ã³ã£ããããæåã¨ãæãã®ã§ãä»åã®å¤æ´ã§ã³ã¼ãã®ä¿®æ£ãå¼·ãããã¦ã¤ãããã¨ããäººã®æ°æã¡ããããã¾ãã
ãããããããã©ã®ãããªæåãããã¨ã¿ããªã幸ãã«ãªãããã§ããããâ¦ï¼ï¼ï¼
*1:association=ããã®æåãããã®ã¯æ¸ããã¦ãã http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one ããã©ãbuild_associationãcreate_associationã¯Railsã¬ã¤ãå«ãã¦æ¸ããã¦ããªããã
*2: ã³ã¼ãçã«ã¯ãã®ãããã該å½ãã¾ãã https://github.com/rails/rails/blob/89508b95d8d289b430cca7db05109d8171ff7a5f/activerecord/lib/active_record/associations/has_one_association.rb#L94-L116
*3:!ãªãã®create_associationã§ããªãã¼ã·ã§ã³ã¨ã©ã¼ã«ãªã£ãã¨ãã¯å¤ãããæ¢åã®ã¬ã³ã¼ããDELETEãããã®ã§ãããããã¯build_associationãã¦saveãã¦ãä¸ç·ãªã®ã§ãããã仿§ã¨è¨ããªãããªã