TakayukiKoyama Geek Blog

Create, Entertain, Experience

【RailsGuide】Active Record の関連付け belongs_to の primary_key の用途

目的

 belongs_to の primary_key におけるマイグレーション設定が分からなかったのでメモする。

 分かってないこともまだまだ有るので、後で整理する。

Active Record の関連付け (アソシエーション) | Rails ガイド

class User < ApplicationRecord
  self.primary_key = 'guid' # 主キーが guid になります
end
 
class Todo < ApplicationRecord
  belongs_to :user, primary_key: 'guid'
end

マイグレーション

 id: false にすると、referencesのマイグレーションが通らないからidは必要。references(foreign_key ?)をすると関連付けがうまくいかないので、Todo側は t.integer で外部キーを作る。

# user
class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.integer :guid
      t.timestamps
    end
  end
end

# todo
class CreateTodos < ActiveRecord::Migration[5.1]
  def change
    create_table :todos do |t|
      t.integer 'user_id'
      t.timestamps
    end
  end
end

 t.integer :guidt.integer 'user_id't.string ... とすると文字列の主キーも作れる。

MacOSのHDD容量確保するための対策【Homebrew編】

目的

 最近、256GBのHDDで空き容量を確保するのに必死な日々から開放されるために一つ気づいたことがあるのでメモ。

気づいたこと

 いつも色々と開発をしていると、空き容量が10GB以下にまで追い詰められてOSのアップデートができなくて悩まされたりする。  通常、空き容量を増やすとなると、Cachesディレクトリを削除したり、アプリ開発だったら使わないOSバージョンSDKやシミュレーターの削除、画像や動画の削除、使わないアプリケーションを削除したりするが、今までやっていないことがあった。  特に真新しいことはなく、やっている人は結構いると思うが、Homebrewに入っているformulaの古いバージョンを削除することだ。

手順

 以下の方法で、あるformula(例えば、git)が複数バージョンをインストールしている場合、古いバージョンをきれいに削除してくれる。

$ brew cleanup [Formula]

参考:Homebrewで不要なversionを削除 | technote

 formulaの確認方法は以下のコマンドで可能だ。

$ brew info [Formula]

 ただ、複数バージョンがインストールされているformulaを探すのは、コマンドよりもFinderアプリケーションで下記のパスを開いたほうが簡単だと思う。

/usr/local/Celler/<各formula>

RailsGuideにPR出してみた。 `after_touch`

目的

 ActiveRecordコールバックで出力結果が正しくなかったので直した。

経緯

 RailsGuideでRailsの勉強してたら、ActiveRecordコールバックで出力結果が異なっていたので調べてみた。  原文を調べてみたら、原文も出力結果が同じで、「もしかして本家にコミットできるチャンス?」と思ったらEdge(最新)では修正されていた😅  とはいえ、間違いは早めに直しておいたほうが良いと思うのでissueを投げてみた。

 すると、RailsGuideを運営しているYassLabの安川さんからリプをいただいた。最初はどう修正したら良いのかよく分からなかったが、なるほど確かに過去のPRを見れば大凡どこを修正すれば良いか分かることに気づいた。

ということでPR

 https://github.com/yasslab/railsguides.jp/pull/702

 無事にマージされました。

ちなみに今回の問題点

 issueにも書いたが、関連付けされたモデルに対して touch: true をつけて、 after_touch するときにどちらが優先されるかを実行して確認してみると、自身のモデルが先にタッチされて、後から関連付け元のモデルの after_touch が呼び出された。修正前は順番が逆になっていた。

# 正しい出力
>> @employee.touch
Employeeにタッチされました
Employee/Companyにタッチされました

なにはともあれ

 今日からOSSコミッターです(?)。コードというより文章を直しただけだけど。

ReactNative の react-native run-ios 等で Failed to load bundle にハマるときの対策

目的

 開発期間が空くと忘れるので、メモ。

参考

Clearing the Cache of your React Native Project · GitHub

RN < 0.50 - watchman watch-del-all && rm -rf $TMPDIR/react-* && rm -rf node_modules/ && npm cache clean && npm install && npm start -- --reset-cache
RN >= 0.50 -  watchman watch-del-all && rm -rf $TMPDIR/react-native-packager-cache-* && rm -rf $TMPDIR/metro-bundler-cache-* && rm -rf node_modules/ && npm cache clean && npm install && npm start -- --reset-cache

npm >= 5 - watchman watch-del-all && rm -rf $TMPDIR/react-* && rm -rf node_modules/ && npm cache verify && npm install && npm start -- --reset-cache

Windows - del %appdata%\Temp\react-native-* & cd android & gradlew clean & cd .. & del node_modules/ & npm cache clean --force & npm install & npm start -- --reset-cache

 上記の方法で大体解決するが、プログラムを直したり上記の対応しても何も変わらない場合がある。そのときは、8081ポート上に古いプロセスが動きっぱなしの可能性があるので、以下の方法で8081ポートが何をしているか確認する。

$ lsof -i:8081

 プロセスは以下の方法で終了できる。

$ sudo kill -9 <プロセスID>

 あとはプログラムを直して、 $ react-native run-ios すればエラーは直ると思う。

Angular >= 5.5.0 switchMap

目的

 switchMapのparamsのデータを参照したらエラーになったので、その解決策

StackOverFrow

javascript - Q: Angular2: 'switchMap' does not exist on type 'Observable<Params>' - Stack Overflow

import { switchMap } from 'rxjs/operators';

\\...

this.route.params.pipe(switchMap((params: Params) => /*... */))
  .subscribe(/*... */);
\\...

 params: Params で型を指定したら解決した。

Angular 6.0.0 から Observable.of が使えなくなった

目的

 Angular 6.0.0 でアプリ作ってたら Observable.of でエラー吐くようになったのでメモ。

StackOverFrow

 安定と信頼のStackOverFrowさん。

 angular - Property 'of' does not exist on type 'typeof Observable - Stack Overflow

import { of } from 'rxjs';

 をimportして、

of('token');

 することで解決した。 ofObservable から独立したようだ。