2020年12月31日木曜日

docker-composeでmroongaを使う

まとめ

  • 全文検索が必要だったのでElasticSearchを検討したがメモリ1Gサーバでは起動しないようなのでMroongaにした。
  • docker-hubにあるイメージは mysql8022_mroonga1010が最新だったがリスタートを繰り返してしまう。。(メモリ不足?)
  • mysql5732_mroonga1010 は安定して起動できた。

docker-compose.yml

version: '3'
services:
  mysql:
    image: groonga/mroonga:mysql5732_mroonga1010
    container_name: hoge-db
    volumes:
      - hoge-db:/var/lib/mysql
    ports:
      - "127.0.0.1:3306:3306"
    restart: always

違うバージョンを同じvolumeで試していたからかうまくいかず、 /var/lib/dockerを削除してdockerデーモンを再起動したらうまくいった。

接続

MySQLのDockerイメージと違ってrootのpasswordはデフォルトでなしになっているのでローカルホストからのみ接続できるようにportで設定して接続する。

Written with StackEdit.

2020年12月12日土曜日

RubyOnRails: 入れ子のパラメータをストロングパラメータする。

purchase(購入)に複数のitem(=items 商品)がネストしているパラメータを受け取って、 permitして返すメソッドを作る場合、
purchaseは普通にpermitすればいいが、itemsをどうpermitするか。

(メソッドの呼び出し元では permited_parameter.items.first.product_name のように、 itemの属性にもメソッドチェーンしてアクセスしたい。)

以下な感じでする。
def permited_parameters
  params.require(:purchase).map do |purchase|
    visit.permit(
      :customer_name,
      :customer_address
    ).merge(
      items: visit[:items].map do |item|
        item.permit(
          :product_name,
          :count,
          :price
        )
      end
    )
  end
end

2020年12月8日火曜日

JavascriptからHTML5のvalidationを実行するには

reportValidity() を実行する。
let form = getElementById("form");
form.reprotValidity();

2020年10月18日日曜日

javascriptでもrubyのようにmapやselectをメソッドチェーンして使う方法

filter(select) + map

const ids = this.visits.filter(visit => visit.bulk_action_flag).map(visit => visit.id)

map + reduce

reduceで配列の総和を計算。
return visit.items.map(item => item.purchase_unit * item.count).reduce(function(prev, current) {
  return prev + current;
}, 0);

2020年10月4日日曜日

Chart.jsで特定のデータセットだけ凡例を表示する。

  グラフ中にデータセットが多いと凡例も多くなり返って見辛い。。

特定のデータだけ凡例を出すということができないかと思っていたらできた!

 凡例の設定をする options.legend はデータごとに記載はできない。が以下のようにすると表示対象を絞ることができる。

      legend: {

        display: true,

        position: 'left',

        labels: {

          filter: function(items, chartData) {

            return items.text.startsWith("累計")

          }

        },

        reverse: true

      } 

 これだとラベルが「累計」で始まるデータの凡例だけを表示する。

reverse: trueは凡例の並び順をデータ順と逆にするために設定。線グラフの積み上げグラフだと初めてにデータ定義した方が下に来てしまうのでわかりやすくするため凡例も並びが同じなるようにしている。

 

 

2020年9月19日土曜日

VueのページからVueのページに遷移するときにコンポーネントが更新されない。

 Rails+Vueで開発中に、 Vueの入力フォームを日付を変えて遷移するリンクを押しても、 Vueのデータが更新されない。。 turbolinksの影響のようだ。。 turbolinksとVueの共存方法はググると出ていたが、 https://qiita.com/midnightSuyama/items/efc5441a577f3d3abe74 うまくいかない。。 こんなにコード書かなきゃいけないのか。。

 今回はVueへの遷移時だけturbolinksをoffにすることで対応。
<a class="navi-item nav-link " data-turbolinks="false" href="/hoge">Vueのページへ</a>

Vueが使われているページが多い場合はだめだな。

2020年8月28日金曜日

ActiveRecordでjoinして同じカラム名の値があると後勝ちになる。

やっちゃいがちなはまりポイント。
irb(main):033:0> Visit.all.joins(:items).select('visits.id, items.id').first.attributes
  Visit Load (2.0ms)  SELECT  visits.id, items.id FROM `visits` INNER JOIN `items` ON `items`.`visit_id` = `visits`.`id` ORDER BY `visits`.`id` ASC LIMIT 1
=> {"id"=>2}
irb(main):032:0> Visit.all.joins(:items).select('visits.id as visit_id, items.id as item_id').first.attributes
  Visit Load (2.6ms)  SELECT  visits.id as visit_id, items.id as item_id FROM `visits` INNER JOIN `items` ON `items`.`visit_id` = `visits`.`id` ORDER BY `visits`.`id` ASC LIMIT 1
=> {"id"=>nil, "visit_id"=>101, "item_id"=>2}
visits, itemsともにid があるが、 結果から .id として取得するとitemsのidになる。 SQLだと
  > select id from visits join items on visits.id = items.visit_id where visits.id = 101 \G;
ERROR 1052 (23000): Column 'id' in field list is ambiguous
となってそもそも実行できないがActiveRecordだとエラーにはならない。 ActiveRecordでselect句を使うのは結構注意。.* で指定するのやめた方がよさそう。