u16suzuの blog

日々学んだことのメモブログです。

rails

ARの自己結合と関連をcreate

自己結合 自己テーブルを参照する関連も作ることができる class AddColumnToPosts < ActiveRecord::Migration[6.0] def change add_reference :posts, :prev_post add_reference :posts, :next_post end end class Post < ApplicationRecord belongs_to :cat…

ARのrelationのメソッド定義

Association extensions # Post::ActiveRecord_Associations_CollectionProxy に hoge メソッドを生やす. # 当然メソッド内でのselfはPst::ActiveRecord_Associations_CollectionProxyで posts が入っている。 # CollectionProxyに生えているので 当然 Post.…

rails console から任意のメソッドのソースコードをRubyMineで開く

設定 .pryrcに以下を追記する。RubyMineのCUIコマンドがない場合は Tools > Create Command-line Launcher... で作っておく。 Pry.config.editor = proc { |file, line| "/usr/local/bin/mine --line #{line} #{file}" } Pry.commands.alias_command 'mine',…

ARのjoinまわりのメソッドを勉強した

ARのjoinまわりのメソッドを勉強した。N+1を解消するのにとても便利。 joins アソシエーションをキャッシュしない アソシエーションを検索条件でだけつかいたいときに有効 内部的には普通にjoinしてる preload アソシエーションをキャッシュする 必要なテー…

scopeの使い方メモ

よくググるのでメモ scope :available, -> { where('deleted = false') } scope :available, -> { receivable.opened.showable } # 引数あり scope :find_by_friend_ids, -> friend_ids { where( target_id: friend_ids ) }

enumのメモ

定義 class Log < ActiveRecord::Base enum reason: { login: 0, purchase: 1, finish_game: 2 } end 呼び出し 以下のように書いておくと、後から変更が必要になった時にわかりやすい pry(main)> Log::reasons[:login] => 0 全部欲しい場合 pry(main)> Log::…

ActiveSupportの Array のメソッドを一通り眺めてみる

ActiveSupport の Array の拡張メソッドを一通り眺めてみた extract_options! 引数のオプション部分だけをかえしてくれる. メソッドを定義するときに便利 def options(*args) args.extract_options! end options(1, 2) # => {} options(1, 2, a: :b) # => {:…

2016/8/1(mon)の日記

プロジェクトで使っている bundler で入れたgemの調査をするためのコマンドをbashで書いた。 Ruby 書くときは atom がメインエディタになりつつある。 RubyMineは重いので、コードリーディングの時だけ使っている。 ### bundler でインストールした gem を編…

よく使うクエリパラメータ系のメソッドを使い回せるようにする

ページネーションがあるAPIを作るとき毎回書くのが大変なので共通化した。 base_controller.rb に書いておくと、他のコントローラから使い回せて便利。 def params_page params[:page].try(:to_i).presence || 1 end def params_site_ids params["site_ids"].tr…

where メソッドに between句を range で指定する

今 Rails Guides の ActiveRecordのところを読んでいる。 Hashで range を指定することで, between 句が書ける事を知った。 Client.where(:created_at => (Time.now.midnight - 1.day)..Time.now.midnight)

たまにはRailsのIssueを読んでみる

今日はこのIssueを読んでみた ActionController::Parameters#== does not works as expected · Issue #21032 · rails/rails · GitHub hash = { foo: :bar } params = ActionController::Parameters.new(hash) params == hash #returns false あるHashから生…

json形式のファイルからインポートする

rails admin だと json形式でエクスポートできるけど, インポートはできない. s = File.read("./site.json", :encoding => Encoding::UTF_8) JSON.parse( s ).each { |elem| s = Site.new(elem); s.save }

deploy時にマイグレーションもする

deploy時にマイグレーションもする. $ be cap deploy:migrations これをやらないと unicorn の restart が必要になってしまうので DBスキーマ更新するときはやった方が良い.

キャッシュをクリアする

Rails コンソールで memcached とかのキャッシュをクリアする方法 ActionController::Base.cache_store.clear ではなくて Rails.cache.clear をつかう. どっちでもクリアできるけど, 前者を使ってしまうとすごく遅い.

FactoryGirlsメモ

FactoryGirl.build(:user) : オブジェクト生成のみ. DBに保存しない. FactoryGirl.create(:user) : オブジェクトを生成し, かつDBに保存する. 参考 http://o.inchiki.jp/obbr/159#toc_8 http://blog.livedoor.jp/sasata299/archives/51931175.html

Railsのログについてのメモ

カスタムロガーを作ってそこに出力する 以下の方法で専用のログファイルを作成し、そこに出力させることができる configの production.rb に追記 config.hoge_logger = Logger.new( 'log/hoge.log', 'daily' ) ログをとりたい部分に追記する。 タイムスタンプ…

like search

1.9.1 :052 > Post.where('name like "%hoge%"') こっちでもよい 1.9.1 :008 > User.where('user_name like ?', "%hoge%" )

rails runner で条件分岐

rails runner (one liner) で無理やり条件分岐 spring rails runner "if true; p 'true'; else; p 'false' end;" セミコロンをつけていくだけだが、なかなか苦しい。(汗 ruby script の場合は -e が必要 ruby -e " if true; p 4; else; p 3 end;"

read_attribute and write_attribute can use both symbol and string as arguments.

In ruby on rails read_attribute and write_attribute can use both symbol and string as arguments.If you use attributes method you can use only string as argument.via: http://blog.eiel.info/blog/2012/12/17/read-attribute-activerecord/

therubyracerとexecjsをインストールしたのに execjsがないというエラーが出る場合の解決方法

こんなエラー Could not find a JavaScript runtime . See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)node.js入れて, therubyracerと execjsをGemfileから消して bundle updateしたら治りまし…

layoutの中で複数の yield を使う

viewでcontent_forメソッドを使用すればよい。multi_layout.html.erb (layout) <%= yield :extend_menu %> <%= yield %> <%= yield 'extend_menu' %>multi.html.erb (view) 文字列とシンボルは区別される。 <% content_for :extend_menu do %> header <% end…

ブロック引数を使う場合の haml のシンタックスエラー

ブロック引数 なのに、インデントができていないこと が原因 以下の例で発生する。 = form_for @book do |f| # ブロック引数 -# この行でインデントなし以下のエラーが全て発生する。 syntax error, unexpected ')' unterminated string meets end of filesy…

Ruby on Rails Naming Conventions (Rails の命名規則というか命名規約というか)

いわゆる Railsの基本理念の1つ CoC (Convention over Configuration, 設定より規約) の規約部分です。Railsではファイル名、クラス名などを規約通りに書かないと動きません。(そして rails vim でも Rcontroller book とかやって怒られる。ただしくは Rcont…

AbstractController::DoubleRenderError

Rails で AbstractController::DoubleRenderError が出た時の対処法。 2回render しちゃってるので、 and return をつけて、終了させる。 redirect_to(...) and returnエラーメッセージに書いてあります。親切。

rails のカラムの型一覧

string 文字列型。 text テキスト(不定長文字列)型。 integer 整数型。 float 浮動小数点数型。 decimal 固定長整数型。 datetime 日時型。 timestamp タイムスタンプ型。 time 時刻型。 date 日付型。 binary バイナリ文字列型。 boolean 真偽値型。 refe…

rails の generation コマンドまとめ

マイグレーション Wordモデルに Group IDカラムを追加する #rails g migration AddGroupToWord group_id:integer スネーク記法でもおk #rails g migration add_hoge_to_word hoge:string モデルからカラムを削除する。 # rails g migration remove_hoge_fro…

rails の定数メモ

Rails.root アプリケーションルートディレクトリのパス Rails.env RAILS_ENV="hoge"で起動時に指定した環境変数

Rails.vim の使い方メモ

:R controller と view の入れ替え gf カーソル位置のモデルに飛ぶ :bn 前のバッファに戻る。gfで飛んでから戻るとき使う。 以下の機能は、Rmodel で補完ができます。 model名などは単数形、複数形は区別されます。 Rmodel model名 modelに飛ぶ Rcontroller …

rails3 の rake コマンドまとめ

情報表示 rake -T rake タスク一覧を表示 rake db:version 現在のDBバージョンを表示 (例. Current version: 20120611044441) rake db:charset DBの文字コード表示 rake db:collation DBの照合順序を表示 migration1 rake db:create database.yml の内容でデ…

rake db:migrate で 「No migration with version number 3」 エラー

rails勉強会に参加するために、railsを触っていた。 rake db:migrate後以下のエラーが発生した。 $ rake db:migrate rake aborted! No migration with version number 3Tasks: TOP => db:migrate (See full trace by running task with --trace) どうやら、…