Ruby

Rails4 ActiveRecordのincludesで読み込んだ関連の値を利用するためにはreferencesメソッドが必要

Rails4で次のようにActiverecordを書いたら、警告メッセージが表示された。 Post.includes(:comments).where("comments.title = 'foo'") Rails4からは、読み込んだ関連テーブルの値を利用するためには、referencesメソッドで利用することを明示しなければな…

ステータスコード

『Webを支える技術』で、ステータスコードについて勉強したので、メモ。 ステータスコード ステータスコードは3桁の数字で、先頭の数字によって次のように分類される。 1xx:処理中 処理が継続していることを示す。 クライアントはそのままリクエストと継続…

HTTPメソッド

『Webを支える技術』で、HTTPメソッドについて勉強したので、メモ。 HTTPメソッド メソッド 意味 GET リソースの取得 POST 子リソースの作成、リソースへのデータの追加、そのほかの処理 PUT リソースの更新、リソースの作成 DELETE リソースの削除 HEAD リ…

Rails4 列名の変更

データベースにテーブルを作ったが、列名を変更したくなった。 列名の変更方法を調べたのでメモ。①マイグレーションファイルを作成 コマンドプロンプトで下記のようなコマンドを実行する。 rails g migration RenameColumnToTargetTable (例) コマンドプロ…

Rails4 モデル名等を変更

モデルもコントローラもビューもスペックのテストもつくったが、モデル名を変更したくなった。今回はCombinationsをTargetsに変更するものとする。 1.テーブル名を変更 コマンドプロンプトで下記を実行し、マイグレーションファイルを作成する。 rails g mig…

Rails4 ActiveRecordでINを使用したい場合、ハッシュで指定できる

ActiveRecordでINを使用したかった。想定したSQLは下記。 SELECT * FROM tests WHERE user_id IN (1, 2, 3) 最初は下記のように記載したが、もっとスマートな方法があった。 Tests.where("user_id IN (?)", [1, 2, 3]) 下記のようにハッシュで配列を指定する…

Rails4 rspecのテストでスタブで例外を投げる

テストでスタブでsave!で例外を投げるようにしたかった。 Recordクラスの下記のようなsave_recordという関数があったとする。 def save_record(user) begin self.transaction do record= self.new record.user_id = user.id record.user_name = user.name re…

Rails4 rspecによるスタブ、モックを使ったテスト

テストでスタブを使う必要があったので、スタブとモックのメモ。 スタブは、あるオブジェクトのメソッドが呼び出された時に、特定の戻り値を返すようにしたい場合に使う。 モックは、あるオブジェクトのメソッドがある引数で呼ばれたときに、特定の戻り値を…

Rails4 自作のエラークラスを作成する

システム独自のエラーを出したかったので、自作のエラークラスを作成することにした。最初はExceptionクラスを継承しようと思っていたが、Exceptionクラスはシステム関連の例外まで含んでいるので、アプリケーションレベルの例外のトップであるStandardError…

Rails4 validatesで整数とnilのみ許可する

バリデーションで整数のみに設定することは多かったが、nilも許可しないといけない状況になった。調べてみると、allow_nilで設定できるようだ。たとえば、numberに整数とnilのみ許可するには下記のように記載する。 validates :number, :numericality => {:o…

Rails4 wicked_pdfでPDF出力 ※windows未対応

wicked_pdfを使って、HTMLをもとにPDFを生成する手順のメモ。 まず、Gemfileに下記を追加する。 gem 'wkhtmltopdf-binary' gem 'wicked_pdf' コマンドプロンプトでbundle installを実行する。 bundle insatall --path vendor\bundle config/initializers/wic…

Rails4 gemのインストールパスを取得する

パス指定をするために、gemのインストールパスを取得したかった。gemのインストールパスを取得方法のメモ。 # wkhtmltopdf-binaryのインストールパスを取得する場合 Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path # railsのインストールパスを取得…

Rails4 リンク先のturbolinksを無効にする

showでChart.jsを使ってグラフを表示するようにした。 Chromeでは正常に動作したが、IEでは初回表示時にグラフが表示されないという現象が起きた。 起動直後の初回表示時だけで、そのままの画面で更新するとグラフは正常に表示された。 ちなみに、私の環境は…

Rails4 Chart.jsでレーダーチャートを表示する

レーダーチャートを表示したかった。 「Chart.js」というものを使うと簡単にレーダーチャートを表示できた。 まず、下記のページからChart.jsをダウンロードする。 nnnick/Chart.js · GitHub 画面右下の「Download ZIP」ボタンをクリックすると、ダウンロー…

Rails4 pluckで必要なカラムの値を配列で取得する

以前、必要なカラムの値を配列で取得する方法を下記の記事で紹介しました。 必要なカラムの値を配列で取得する方法 - ayaketanのプログラミング勉強日記しかし、もっとスマートな方法があることを知りました。 しかも、その方法だと必要な複数のカラムの値を…

小数第2位以下の切り捨て

達成率を小数第1位まで表示したかった。当初下記のように記載していたが、四捨五入が行われるため、達成率が99.99%の場合、100.0%となってしまう。 sprintf("%.1f", numerator.to_f/denominator*100) 調べたところ、BigDecimalという可変長浮動小数点計算…

Rails4 ルーティングのgetでアクションを指定する

ルーティングのgetでアクションを指定する方法のメモ。 routes.rbにルーティングを記載して、user_topのindexを呼び出したかった。当初下記のように記載したが、これだとURLがuser_top/indexになってしまう。 get "user_top/index", :as => :user_top URLをu…

Rails4 findでActiveRecord::RecordNotFoundではなくnilを返したい

findで失敗するとActiveRecord::RecordNotFoundが返ってくる。 例外処理をしてもいいが、ちょっとめんどくさいのでnilが返ってくるようにしたかった。 find_by_idという手もあったが、Rails4ではfind_byでハッシュが渡せるので、find_byを使用することにした…

Rails4 表形式で複数同時に更新

表形式のデータを複数同時に更新したかった。 ちょっと苦戦したのでメモ。routes.rbでルーティングの設定 resources :evaluations, only: [:edit, :update] get 'evaluations', :to => 'evaluations#edit', :as => :evaluations_edit post 'evaluations', :t…

Rails4 rspecによる例外のテスト

関数のテストをするとき、正常に例外が発生するかテストしたかった。仮に下記のような関数を作る def get_name(number) case number when 1 "名前1" when 2 "名前2" else raise ArgumentError, "引数が範囲外です。number= #{number}" end end specのテス…

Rails4 find_byでちょっとスマートに

Rails4ではfirstを使う代わりに、find_byでもっとスマートに書けるようです。firstを使った場合 User.where(:school_id => 1, :class_id => 1).first find_byを使った場合 User.find_by(:school_id => 1, :class_id => 1) to_sqlは使えないので、色々なパタ…

Rails4 ActiveRecordのdestroyで例外を発生させる

トランザクション内で削除を実行し、例外をキャッチしたかった。Rails4からdestroy!があるようだが、destroy_all!は存在しない。単体の削除は下記のように記述すればよい @user.destroy! 複数の削除は下記のように記述するしかないようだ users.each do |use…

Rails4 ActiveRecordでorを使用する

whereでORを使用したので、メモ。Userにclass1_id、class2_id、class3_idがあり、そこにはClassのidを登録するものとする。 class1_id、class2_id、class3_idのどれかが1であるユーザーを探したい。 class1 = User.where(:class1_id => 1) class2 = User.whe…

Rails4 トランザクション内で故意にエラーを起こす

トランザクション内で自分でチェックを行い、エラーがあった際にはロールバックしたかった。 トランザクション内で故意にエラーをおこすにはraiseを使うようだ。例 class << self def add_grouping(group_id, user_ids) begin self.transaction do user_ids.…

Rails4 scaffoldで作成したファイルの削除方法のメモ

scaffoldで作成したファイルを削除する方法をメモしておく。 rails destroy scaffold コントローラ名 下記のようにscaffoldで作成したファイルを削除するには、 rails g scaffold user name:string 次のように記載して実行する。 rails destroy scaffold use…

Rails4 includesで関連テーブルを先読み

グループに所属するユーザーの名前一覧を表示したかった。 Groupテーブルにはuser_idを持つ。Userテーブルのnameにはユーザー名が入っている。関連テーブルの先読みをする場合、includesを使用するようだ。Groupのコントローラーのindexに下記のように記載す…

Rails4 外部キー名が異なる場合のhas_many through

リレーションで外部キーを変更したあと、has_many throughをしようとして躓いたので、メモ。UsersテーブルとSalesテーブルとProductsテーブルがあるとする。 UsersテーブルのidとSalesテーブルのcustomer_idを紐づけ、中間テーブルであるSalesを介さずにProd…

Rails4 リストボックスで複数登録

リストボックスで複数登録するときにちょっと手こずったので、めも。ビューに下記のように記載。 <%= form_for(@sales) do |f| %> <div class="field"> <%= f.label :customer_id %><br> <%= f.select :customer_id, @users.map {|user| [user.name, user.id]}, {:selected=>f.objec</div>…

必要なカラムの値を配列で取得する方法

必要なカラムの値を配列で取得する方法をメモ。UsersテーブルからグループIDが2のユーザーIDを配列で取得したい場合、下記のように記載する。 user_ids = User.select(:id).where(:group_id => 2).map(&:id) 不動産に興味を持ち始めたエンジニアのメモ帳…

rails4 リレーションで外部キー名を変更

リレーションで外部キーを変更したので、メモ。UsersテーブルとSalesテーブルがあるとする。 UsersテーブルのidとSalesテーブルのcustomer_idを紐づけたかった。 class User < ActiveRecord::Base has_many :sales, :foreign_key => "customer_id" end class…