javascriptで存在確認をして論理値を返す時の書き方
小ネタですが
javascriptでたまにある
- パラメータが存在する場合はtrueを返す
- パラメータが存在しない場合はfalseを返す
if (function_junction) return true return false
みたいに書けますが
return !!function_junction
の様に書くことも可能です。
ビックリマーク一つの時は
パラメータをtrue,falseで評価した後にその値を反転させます。
trueの対象になるもの
0以外の数字、文字列など
falseの対象になるもの
数字の0、null、undefind
ビックリマークを二つ付けた場合は
0やnullなどの値であったとしても必ず論理値を返すようになるので
入力した値に対して論理値で返して欲しい時に使うことになります。
react nativeでmain.jsbundle does not exist. This must be a bug with React Native, please report it hereと出た時(ver0.70.4)
AppStoreに審査提出しようと思い
product -> archiveをしたところ上記エラーが発生した。
react nativeのバージョンは0.69.5 -> 0.70.4にアップデートした後でした。
androidのビルドでhotfix(0.70.5)が出ていましたが弊社ではAndroid使っていないので関係なしでした
バージョンを0.69.5にロールバックするとarchive可能でした
結果から書くとnodeの場所が違っていた様です
which nodeして出てきたパスを
which node # nodeのアドレス /Users/arai-t/.nvm/versions/node/v16.13.2/bin/node
XcodeのBuildPhases-> Bundle React Native code and images の
export node
の記載を
# which nodeで表示されたアドレス export NODE_BINARY=/Users/ユーザー名/.nvm/versions/node/v16.13.2/bin/node
に変更したところ、archive出来ました
私はnvmでnodeをinstallしているのがよくなかった様です
nodenvやanyenvだと大丈夫という話があります。
javascriptでif ~ else ~ で論理値を返す時の書き方
小ネタ
たまに忘れてしまい、コードレビューでご指摘頂くので健忘録
javascriptである値が一致する場合はtrue、一致しない場合はfalseを返す時
let use = '' if (number === 1) { use = true } else { use = false }
みたいに書いてしまうけど
const use = number === 1
でワンラインで書ける
rubyのcompact!を使うときに覚えておきたいこと
compact!とは
compact は自身から nil を取り除いた配列を生成して返します。 compact! は自身から破壊的に nil を取り除き、変更が行われた場合は self を、そうでなければ nil を返します。
compact! はArrayに nil が含まれるかどうかで戻り値の型が変わるので
# compact! irb(main):007:0> [1,2,3,nil].compact! => [1, 2, 3] irb(main):008:0> [1,2,3].compact! => nil # compact irb(main):009:0> [1,2,3,nil].compact => [1, 2, 3] irb(main):010:0> [1,2,3].compact => [1, 2, 3]
メソッドチェーンする場合は compact を使った方が事故がない。
railsのActiveRecordでandとorの複合条件の絞り込みをする時
railsのActiveRecordで
AかつBorC(A and (B or C))の条件を満たす書き方のメモです。
結論: .mergeを使用する
.where(条件A) .merge(モデル名.where(条件B).or(モデル名.where(条件c)))
SQLを書いてしまった方が楽なのですがActiveRecordで書きたい場面があったので
何らかの理由でSQLを書きたくない、そういった時に使います。
今回想定するテーブル構造は下記です。
テーブル構造
class MasterProduct < ApplicationRecord has_many :order_product end # ### Columns # # Name | Type | Attributes # ------------------------------------------ | ------------------ | --------------------------- # **`created_at`** | `datetime` | `not null` # **`distribution_packaging_code`** | `string(14)` | # **`id`** | `integer` | `not null, primary key` # **`jan_code`** | `string(13)` | `not null` | # **`updated_at`** | `datetime` | `not null`
class OrderProduct < ApplicationRecord belongs_to :master_product end # ### Columns # # Name | Type | Attributes # ---------------------------- | ------------------ | --------------------------- # **`created_at`** | `datetime` | `not null` # **`id`** | `integer` | `not null, primary key` # **`pharmacy_id`** | `integer` | `not null` # **`wholesaler_id`** | `integer` | # **`master_product_id`** | `integer` | `not null`
MasterProductに紐づくOrderProductテーブルがある
OrderProductのpharmacy_idがxかつMasterProductのdistribution_packaging_codeかjan_codeが指定の値のレコードを取り出す
SQLにするとこう
(SELECT order_products.wholesaler_id, order_products.master_product_id FROM order_products INNER JOIN master_products ON master_products.id = order_products.master_product_id WHERE order_products.pharmacy_id = :pharmacy_id AND (master_products.distribution_packaging_code = :distribution_packaging_code OR master_products.jan_code = :jan_code) ORDER BY order_appointed_on DESC, order_products.created_at DESC LIMIT 1)
ActiveRecordにするとこう
OrderProduct.select(:id) .where(pharmacy_id: pharmacy.id) .joins(:master_product) .merge(MasterProduct.where(distribution_packaging_code: params[:id]).or(MasterProduct.where(jan_code: params[:id]))) .order(order_appointed_on: :desc, created_at: :desc) .limit(1)
Rspecでsubjectを複数回実行する
失敗例
subjet subjet expect(~~)
subjet expect { subject }
解答
subjectの実行内容の外側を.times
で囲む
subject { 2.times { post :create, params: request_params } }
Redisで特定のキャッシュを削除する
原因
表示の際の負荷低減のためある情報をキャッシュしていたのですが
後に改修されたその情報のアップデートを行う際にキャッシュの削除が行われていなかったため
古い情報が表示されてしまっていた
対応
redisを動かしているサーバーに入り
redis-cli
- うちの場合は2つ動かしているので指定
# redis-cli -h redis -n 1
keys コマンドでキャッシュ確認
redis:6379[1]>keys *
key名を指定して存在確認も可能、下記の場合は*がワイルドカードになりorganization〜〜のkeyを全て探してくれる
redis:6379[1]>keys organization*
delコマンドで削除したいキャッシュを選択し、削除
redis:6379[1]>del organization_9