upsert_all on_duplicateオプション

Rails 7: upsert_allのon_duplicateオプションに生SQLを渡せるようになった(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

Rails7で on_duplicate付きの upsert に対応している件。

Commodity.upsert_all(
  [
    { id: 2, name: "銅", price: 4.84 },
    { id: 4, name: "金", price: 1380.87 },
    { id: 6, name: "アルミニウム", price: 0.35 }
  ],
  on_duplicate: Arel.sql("price = GREATEST(commodities.price, EXCLUDED.price)")
)

実際にやってみた

no option.

> Tweet.upsert_all [{ id: 1, content: :tweet_test1, user_id: 1, created_at: Time.current , updated_at: Time.current }]
  Tweet Upsert (2.6ms)  INSERT INTO `tweets` (`id`,`content`,`user_id`,`created_at`,`updated_at`) VALUES (1, 'tweet_test1', 1, '2021-09-20 08:01:16.498250', '2021-09-20 08:01:16.498268') ON DUPLICATE KEY UPDATE `content`=VALUES(`content`),`user_id`=VALUES(`user_id`),`created_at`=VALUES(`created_at`),`updated_at`=VALUES(`updated_at`)
=> #<ActiveRecord::Result:0x00007fdb8cdadaf8 @column_types={}, @columns=[], @hash_rows=nil, @rows=[]>

with on_duplicate option.

> Tweet.upsert_all [{ id: 1, content: :tweet_test2, user_id: 1, created_at: Time.current , updated_at: Time.current }], on_duplicate: Arel.sql("`content`=VALUES(`content`)")
  Tweet Upsert (3.3ms)  INSERT INTO `tweets` (`id`,`content`,`user_id`,`created_at`,`updated_at`) VALUES (1, 'tweet_test2', 1, '2021-09-20 08:00:46.938543', '2021-09-20 08:00:46.938560') ON DUPLICATE KEY UPDATE `content`=VALUES(`content`)
=> #<ActiveRecord::Result:0x00007fdb89c30b38 @column_types={}, @columns=[], @hash_rows=nil, @rows=[]>

gitで特定ファイルのタグ間比較

$ git diff tab1..tag2 file/path/name.txt

たとえば rails の特定ファイルの Diff を取る場合はこう。

$ git diff v6.1.4..v7.0.0.alpha1 activerecord/lib/active_record/persistence.rb