arait-code’s RC

もうすぐエンジニア転職して2年になります。

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 を返します。

docs.ruby-lang.org

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の複合条件の絞り込みをする時

railsActiveRecord
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)

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