rails

RailsのActive Recordのmysqlでマイクロ秒を切り捨てる方法

mysqlでマイクロ秒まで計算してくれるのは嬉しいのですが、保存されるときには切り捨てにされています。 Railsのend_of_dayを使うと、.9999になります。 where('start_at <= ? and end_at >= ?', date.beginning_of_day, date.end_of_day) SELECT `xxxx`.* F…

Deviseのログイン後のページ先をユーザーフレンドリーにする

せっかくログインしたのに、トップページに戻ると、なんだこれ?ってなってしまいます。 それを回避する方法です。 class ApplicationController < ActionController::Base before_action :store_user_location!, if: :storable_location? private def stora…

railsで今月・先月の期間を取得する方法

all_monthを使いましょう。 今月の場合 [1] pry(main)> Time.current.all_month => Fri, 01 Dec 2017 00:00:00 JST +09:00..Sun, 31 Dec 2017 23:59:59 JST +09:00 先月の場合 [2] pry(main)> Time.current.last_month.all_month => Wed, 01 Nov 2017 00:00:…

railsの本番サイトのデータベースを別サーバーで行うための方法

今回やりたいことです。 app/dbサーバーを分けて運用する そんなの当たり前だろ!って感じですが、デプロイするときに詰まったので、忘れないために書いておきます。 なお、今回のお話はmysqlでの運用にしておりますが、他のデータベースでも同じ感じでいけ…

railsのroutesのid以外にする方法

railsはdefaultのresourcesは:idになっています。 config/routes.rb resources :users URIのパターンです。 Prefix Verb URI Pattern Controller#Action new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit u…

railsでssl設定をした場合にしておいた方がいい設定

ssl対応をやってみました。 はてなブログもssl対応を行っているし、今となっては当たり前になりましたね。 なぜ、そんなことが起こっているかというと、chromeで安全なサイトではないという警告が出るからですね。 そんなsslですが、let's encryptで行うこと…

railsのARに対するpresent?とexists?のパフォーマンスの差

exists?の方がいいですという指摘を受けた。 なので、ここで確認する。 [4] pry(main)> Work.where(id: [*1..100]).exists? Work Exists (0.5ms) SELECT 1 AS one FROM `works` WHERE `works`.`id` IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, …

webpackerを使用した時にcssをどこに置くのかについて

webpackerを使用していて、cssをどうするか悩みました。 いや、そもそも何に悩んでいるの?という話だと思います。 jsファイルは原則javascript/packsに存在する→jsから読み込むcssファイルはどこに置く?→javascript/stylesを作成して、そこから使用するよ…

railsでboolean値のvalidationをする方法

ちょっと罠にかかりました。 validates :publish, presence: true いつも通りpresence: trueを書いていました。 こうすると、errorになります。 なぜ、そんなことが起こるかです。 rails/presence.rb at d57356bd5ad0d64ed3fb530d722f32107ea60cdf · rails/r…

Deviseでユーザー登録後のリダイレクト先を変更する

Deviseのカスタマイズに少し苦労しました。 大体標準通りに使えば問題ないのかもしれませんが、少し加工しようとするとちょっと調べないといけないですね。 今回行うことは、Deviseでユーザー登録後に、Thanksページに飛ばすことです。 リダイレクト自体は割…

find_by_カラム名のメソッドが動的に生成されていたという事実

例えば、Fooモデルにtitleというカラムがあるとする。 Foo.find_by(titile: "foo") Foo.find_by_title("foo") 下でも検索できる。 いつも上ばっかり使っていたので、下のパターンがあるとは知らなかった。 補足 rubocop的には上の方がいい。 Class: RuboCop:…

ActiveModelでcallbackをする方法

Formオブジェクトを使用していて、まともにActiveModelを使用しました。 ActiveRecordの場合は自動的にcallbackを仕込めるのですが、ActiveModelの場合はどうすればいいのかわからなかったです。 使い方 class WorkForm include ActiveModel::Model define_m…

rails5でautoload問題を解決する

やられましたよ。 rails4 → rails5へのアップデートをしていたのですが、libpathの配下のものが読まれない。 config/application.rb config.autoload_paths += %W(#{config.root}/lib) 問題ないだろ。 そう思っていましたよ。 どうやら、この作業が無効にな…

rails5からはcontrollerテスト書くぐらいなら、requestテストを書くのがいいっぽい

controllerテストいらねみたいな流れだったけど、requestテスト書けって話だったのか。 Rails 3 と 4 において、controller spec の assigns は慣用されてきました。 今回の RSpec 3.5 はマイナーリリースであり、私たちは SemVer に準拠する以上、 既存の c…

rails5ではrender methodをいたるところで使えるようになっている

rails5にアップデートするときに変更されていて、手を加えて変更したので、備忘録として書いておきます。 rails4.2時代のrenderのやり方 下記のように、requestを強引に擬似るような形でやっていました。 class Renderer def renderer controller = Applicat…

mysqlのorder by fieldで指定のID順に並べる

どういった時に使うんだよwwwって思いましたが、使う感じになりました。 select * from icons where id in(4, 5, 6) order by field(id, 5, 4, 6) => mysql> select * from icons where id in(4, 5, 6) order by field(id, 5, 4, 6); +----+----------------…

railsで複合uniqueのvalidationをつけてやる

mysqlとrailsの両方に念のためつけます。 複合uniqueなんて、使うことあるのか?って思っていたけど、必要になりました。 忘れないために書いておきます。 まずは、migrationの書き方からです。 class CreateReactions < ActiveRecord::Migration def change…

has_manyのhas_manyのcountで効率よくパフォーマンスを出す

counter_cacheはできるだけ使いたくないんですよ。 無駄なカラムを持ちたくないということで、頑張りました。 対策としては、最初で全てのcountを手にするのが一番いいですね。 countは重たいので、先に何とかして値を入手したい・・・。 今回のサンプルでは…

クラス変数の注意点

クラス変数なんて、めったに使うことなんてないし、railsで使うならclass_attributeがあるんで、普通は必要ないです。 しかし、よくクラス変数やめろ!なんて言われることが多いと思うので、ここでおさらいしておきます。 クラス変数とは そもそもクラス変数…

mysqlの予約語に気をつけた方がいい

やられました...orz 直接sqlをいじることがなかったのですが、いじった時に気付きました。 mysql> show tables; +-----------------------------------+ | Tables_in_foo | +-----------------------------------+ | categories | | comments | | rankings |…

macのmysqlをupdateしたら、Library not loaded: /usr/local/opt/mysql56/lib/libmysqlclient.18.dylibって出るようになった

なんじゃこりゃーってなりました。 なんだ昔のmysqlを見に行ってるの? そんな古い情報見に行かないでくれよ!って感じだと思います。 原因は、gemの情報で古いmysqlの場所を見に行っているのが原因でした。 gem uninstall mysql2 ここで全てのversionを削除…

railsのmysqlでemojiを使う方法

emojiを使おうと思ったら、色々と問題があるようなので、まとめます。 文字コード問題 collation問題 ハハパパ問題(参考) index問題 mysql側の設定 rails側の設定 文字コード問題 まず、emojiはmysqlのutf8では使用できません。 mysqlでemojiを使用するにはu…

文字列からクラス名にアクセスする方法

constantizeを使用します。 "Topic".constantize => Topic(id: integer, title: string, body: text, category_id: integer, thumbnail_updated_at: datetime, thumbnail_file_size: integer, thumbnail_content_type: string, thumbnail_file_name: string,…

nestしたcontent_tagを書く方法と注意点

nestしたcontent_tagを書く場合です。 concatで連結して書くことができます。 content_tag(:div, class: "c-grid__quotation-image") do concat(image_tag(url)) concat(link_to("出典:#{host_name}", url)) end ただし、こんだけ連結させる場合は、別途ren…

file_fieldに拡張子を制限する方法

今までjs側で処理を行おうとしていました。 普通にhtml属性で設定ができます。 = f.file_field :thumbnail,accept: 'image/jpg,image/jpeg,image/png,image/gif' acceptを使用することで、拡張子が画像系のものしか上げなくできます。 twitterってどうやって…

database cleanerの設定について

rspecのテスト実行時にDatabaseCleanerを使用しています。 データベースを毎回キレイな状態にしてくれるやつですね。 これの何がいいかというと、テストデータが固定化されるのと、増えないのでテストの実行が遅くならないということです。 ただし、設定によ…

viewの条件式を減らす

viewにロジックを書きすぎるな!ってことです。 自戒の意味を込めて書きます。 - if area? && action_name == "show" - if citys? = render "foo" - else = render "bar" - else = render "bar" こういうのがあったとします。 viewにこんだけロジックが積ま…

factory girlのtraitで関連するモデルを作成するのを選択制にする

関連するモデルを作成する場合は、associationを使います。 ただ、必ずしも毎回そのモデルが必要になるのか?と言われると疑問が浮かびます。 なので、選択制にする方が自由度が高いと考えています。 taritは選択制にできるので、使い方を書きます。 trait f…

routeのresourcesのnestした部分をnamespaceにする方法

nestしたresourcesだと、namespaceでcontrollerとviewのファイル置き場が別々になってしまって嫌です。 下のやつです。 resources :foo do resouces : bar end 結果 foo_bar_index GET /foo/:foo_id/bar(.:format) bar#index POST /foo/:foo_id/bar(.:format…

railsの複数形・単数系がうまくいかない場合の対処

どう見てもこれは変換がおかしいだろってことがありました。 'loves'.singularize => "lofe" 普通にloveを返すべきところじゃん・・・ このおかげでpathがnew_lofe_pathなんてなったりしました。 これはどうにかしたいと思ったら、イレギュラー登録をするこ…