諸行無常

IT色々お勉強中のブログ

rails n+1解決のincludesの使い方すぐ忘れるのでまとめ

hoge has_many pogeの場合

Hoge.includes(:poges)

複数の場合

Hoge.includes(:poges,:ages)

ネストされたリレーションの場合

Hoge.includes(:poges,ages:[:doge,boge])
//またはcomの下にtranslationsがある場合
includes(colb: [com: :translations])

includes (ActiveRecord::QueryMethods) - APIdock

↓ちなみに

ActiveRecordでのレコード数のカウント方法

count SQLのCOUNTを使ってカウント(キャッシュ使わない length SQLの実行結果の行数をカウント(キャッシュ使う size SQLのCOUNTを使ってカウント(キャッシュ使う

react学習中

constructor: (props)->

コンポーネントがマウントされる前に呼ばれる。コンストラクタを自分で実装したい場合は

super(props)

を必ず呼ばなければならない。状態を初期化する場所 propsはreadonly stateは変更可能 defaultはpropsとして自分自身の値を参照する場合はhoge デフォルト値を設定する場合はage

    this.state =
      hoge: this.props.hoge
      age: 'age'
componentDidMount: ->

このメソッドはコンポーネントレンダリングされた時にReactが自動で呼び出すメソッドです。Reactではthis.setState()メソッドが呼ばれると新しくstateを設定すると同時に再レンダリングを行います。このcomponentDidMount()メソッドはサーバーからデータを取得してそのデータを元にコンポーネントの再レンダリングを行っています。コンポーネント作成後に実行されるようになっています

  • イベントハンドラ イベントが発生したときに呼び出される処理のこと JavaScriptにおける「イベントをキャッチするグローブ」のこと

  • e.currentTarget.value イベントバブルにおける現在のイベントのDOM要素を返すプロパティ。

  • イベントバブルとは、子要素のイベントが発生すると、その親要素や先祖要素の同じタイプのイベントが発生すること。

へなちょこエンジニア、railsでreact使ってみる

react jsx生成コマンド

rails g react:component CommentBox

react_componentというhelperメソッド

react_component('CommentBox')

値を参照する時に使う

this.props.hoge

値を変更する時に使う

this.setState({ count: this.state.hoge + 1 });

refs divで設定した値とかを参照

console.log(this.refs.myDiv.props.children);  // xxx
render() {
    return (
      <div ref="myDiv">xxx</div>
    );
  }

getDOMNode DOMにフォーカスあてたりする

this.refs.myDiv.getDOMNode().focus();

ruby例外処理捕捉について(slack)

railsで捉えたいexceptionの種類 library _builtin (Ruby 2.1.0)

raiseの仕方 https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#raise

エラーのgem GitHub - smartinez87/exception_notification: Exception Notifier Plugin for Rails

rescue_fromとすることでbeginとかしなくてもそのクラスで起きたエラーを拾ってくれる StandardErrorはちょっと色々広いすぎるので何ですが、、自分でエラーを定義したければlibとかで共通に作る

slack例

  rescue_from StandardError do |exception|
    alert_exception(exception)
  end

  def perform(message, channel='dev')
    hook = Rails.configuration.x.send("slack_#{channel}")
    notifier = Slack::Notifier.new hook, http_options: { open_timeout: 2 }
    notifier.username = channel
    notifier.ping message
 end

  private
    def alert_exception(e)
      ExceptionNotifier.notify_exception(e)
    end

rails timezoneの扱いについて

いろいろ頭の整理の為 application.rbに設定すると変更できる

①表示時のタイムゾーンJSTに変更 config.time_zone = 'Tokyo'

②DB保存時のタイムゾーンJSTに変更 config.active_record.default_timezone = :local

②を設定してなかった時

    yesterday = Time.current - 1.days

      .where('hoges.hoge_finish_at >= ?', yesterday.strftime("%Y-%m-%d 00:00:00"))

DBがUTCなので画面と表示してる時間だと取れない

      .where('hoges.hoge_finish_finish_at >= ?', yesterday.beginning_of_day)

でも以上のようにすると取れるようになった。railsで上手いこと変換してくれる? ちなみにutcに変換するには以下のようにする

yesterday.beginning_of_day.gmtime

rails slackにtaskでメッセージを送る

まずslack側でwebhookの設定

https://creww.slack.com/apps/A0F7XDUAZ-incoming-webhooks

f:id:babababand:20161026205652p:plain

add configurationボタンを押して通知したいslack channel選択

gem 追加

gem 'slack-notifier'

slack側で取得したurlをhookに設定してtaskなどで以下を呼び出す

      hook = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXX"
      if hook
        notifier = Slack::Notifier.new hook, http_options: { open_timeout: 2 }
        notifier.username = :dev
        begin
          notifier.ping "テストです。" 
        rescue
          # no need report problem with Slack
        end
      else
        Rails.logger.warn 'Slack hook is missing'
      end

以上