2021-09-20 upsert_all on_duplicateオプション / gitで特定ファイルのタグ間比較
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