javascriptのif文について

最近疲れがちで感覚でやってしまいがちなのでメモしておく。

<script>
 function testIf(value) {
   if (value) {
     console.log('true');
   } else {
     console.log('false');
   }
 };

 // 数値
 testIf(0); // false
 testIf(1); // true
 testIf(-1); // true

 // 文字列
 testIf(''); // false
 testIf('0'); // true
 testIf('1'); // true

 // 真偽値
 testIf(false); // false
 testIf(true); // true

 // null
 testIf(null); // false

 // その他
 testIf({}); // true
 testIf([]); // true
 testIf(function() {}); // true
</script>

以上です

【Rails】has_many through について

最近、active recordをダラダラいじってるけど全然慣れない。。今回は少しでも理解を深めるために「has_many through」構文?のオプションを省略せずに書いてみたのでメモとして残して置く。

テーブル構造は、以下のようにrailsの規則どおりのもの。
users(id) <==> bank_user(user_id / bank_id) <==> banks(id)

最低限の書き方

class Bank < ApplicationRecord
  has_many :bank_users
  has_many :users, :through => :bank_users
end                                                                                                                                                                                                                
                                                                                                                                                                                                                   
class User < ApplicationRecord
  has_many :bank_users
  has_many :banks, :through => :bank_users
end                                                                                                                                                                                                                
                                                                                                                                                                                                                   
class BankUser < ApplicationRecord
  belongs_to :user
  belongs_to :bank
end

オプションもあえて書く

class Bank < ApplicationRecord
  has_many :bank_users, class_name: "BankUser", primary_key: "id", foreign_key: "bank_id"
  has_many :users, :through => :bank_users
end

class User < ApplicationRecord
  has_many :bank_users, class_name: "BankUser", primary_key: "id" , foreign_key: "user_id"
  has_many :banks, :through => :bank_users
end

class BankUser < ApplicationRecord
  belongs_to :user, class_name: "User", primary_key: "id" , foreign_key: "user_id"
  belongs_to :bank, class_name: "Bank", primary_key: "id" , foreign_key: "bank_id"
end

命名規則に沿っていると、class_name、primary_key、foreign_keyは省略できるみたい。

実行してみる

$ User.joins(:banks)
User Load (1.5ms)  SELECT  `users`.* FROM `users` INNER JOIN `bank_users` ON `bank_users`.`user_id` = `users`.`id` INNER JOIN `banks` ON `banks`.`id` = `bank_users`.`bank_id` LIMIT 11

$ Bank.joins(:users)
Bank Load (0.5ms)  SELECT  `banks`.* FROM `banks` INNER JOIN `bank_users` ON `bank_users`.`bank_id` = `banks`.`id` INNER JOIN `users` ON `users`.`id` = `bank_users`.`user_id` LIMIT 11

・has_manyの場合
class_name : 参照先のモデルクラス名
primary_key : 参照元(自分)の外部キー
foreign_key : 参照先の外部キー

・belongs_toの場合
class_name : 参照先のモデルクラス名
primary_key : 参照先の外部キー
foreign_key : 参照元の外部キー

動きみてると、とりあえずこの解釈で良いのかな。以上です。

【Rails】where like検索の使い方メモ

今回やりたかったことはjoin先のテーブルからLIKE検索したかった。今回使うモデルは2つで以下の形。

class Category < ApplicationRecord
  has_many :movies
end

class Movie < ApplicationRecord
  belongs_to :category
end

こんな感じでできた

Movie.joins(:category).where("categories.name like ?", "%キーワード%").each do |movie|
  puts movie.category.inspect
end

joinsの部分はやりたいことによるけど、left_joins、eager_loadでもできる。この辺りのどれを使うのが最適かはもう少し勉強中。で、何にはまったかというと。以下みたいに条件渡すところを「{ テーブル名: {カラム名: '値'} }」とハッシュ形式としてできないものかとずっといろいろ探してしまった。

Movie.joins(:category).where({categories: {name: 'キーワード'} })

結果、この書き方でlike検索はできないらしい。。gem使うとできるとかできないとか。とりあえず覚えて置く。以上です。

【css】marginを取消(リセット?初期化?)する

css全然わかってないけど、デザインちょっと調整してとか言われるとchromeデベロッパーツール使って、チクチク直すことが多々あります。で、上書きはよくやっていたけど、スタイルの取消?リセット?初期化はやったことなかったかも。

<style>                                                                                                                                                                                                            
/* 既存のスタイル */
.message {
  margin-left:10%;
  margin-right:10%;
}

/* スタイルの取消?リセット?初期化?する */
.message {
  margin-left:initial;
  margin-right:initial;
}
</style>

initialとか知らなかった。以上です。

ionic state resetとrestoreの違い

それぞれのヘルプをみてみる

$ ionic --help
reset   ・・・ Clear out the platforms and plugins directories, and reinstall plugins and platforms
restore ・・・ Restore the platforms and plugins from package.json

reset はplatformディレクトリとpluginsディレクトリをクリアーとある。
ionic plugin add するとリポジトリからpluginsディレクトリにダウンロードしなおして、さらにplatform以下へプロジェクトを作り直す。

restoreの場合は、既存のpluginsディレクトリからpackage.jsonの内容を元にplatform以下へプロジェクトを作り直す。
pluginsディレクトリ自体もgit等で管理している場合はrestoreで。管理外の場合は、resetする必要があると覚えておけばとりあえず良いかな。

以上です

ionic(cordova) config.xmlを環境(development、production)毎に分ける

以前から気になっていた内容。
ionic か corodova の標準の機能でありそうだけどドキュメント眺めたり検索してもよくわからない。みんな必要な機能な気がするがどうやるのが正しいのだろうか。

解決したかったこととしては以下
・アプリのBundle Identifierやアプリ名を本番用と開発用とで分けたい
・cordovaプラグインでインストールの際にAPIキー等の指定が必要なものをどうするか

今回は前者の話で、それを解決するにはconfig.xmlを環境毎に切り替えられるようにする必要がある。
ionic prepare や ionic build すると各platform以下へconfig.xmlを元にプロジェクトを作成するので、これらが行われる前にconfig.xmlを書き換えることにした。

今回はenvironmentディレクトリを作成して、その配下に以下を用意する。
config.xml.tpl : config.xmlのひながた
config.dev.json : development環境の設定
config.pro.json : production環境の設定

environment/config.xml.tpl

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<widget id="${BUNDLE_ID}" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
  ・・・

environment/config.dev.json

{
  "BUNDLE_ID": "com.example.dev"
}

environment/config.pro.json

{
  "BUNDLE_ID": "com.example.pro"
}

ionic1ではgulpが使われているので、gulpfile.jsを編集。
また、ひながたをjsonファイルの値で置換するときに、es6-template-strings というモジュールを使ったのでインストールしておく。

$ npm install --save es6-template-strings

gulpfile.js

var fs = require('fs');
var compile = require('es6-template-strings/compile');
var resolveToString = require('es6-template-strings/resolve-to-string');

// config.xml                                                                                                                                                                                                      
var templateData = fs.readFileSync('./environment/config.xml.tpl', 'utf8');
var configFile = process.env.ENV == 'PRODUCTION' ? 'config.pro.json' : 'config.dev.json';
var configPath =  './environment/' + configFile;
var configData = fs.readFileSync(configPath, 'utf8');
var config = JSON.parse(configData);
var compiled = compile(templateData);
var content = resolveToString(compiled, config);
fs.writeFileSync('./config.xml', content);

build または prepareを行う

## 今回は環境変数でdevelopmentかproductionかをわたす
$ export ENV=PRODUCTION
$ ionic prepare

iOSの場合は、xcodeからプロジェクトを開くと、Bundle Identifierが環境毎に書き換わることが確認できた。以上です。

参考URL
https://stackoverflow.com/questions/37816035/using-environment-variables-parameterizing-config-xml

【ionic】ion-list ion-itemをタップしたときのhighlightの無効化

正しいやり方わからないけど、これでできたので自分用にいったんメモしておく

.item.activated.item-complex > .item-content {
  border-color: #FFF;
  background-color: #FFF;
}