じぶんメモ

プログラミングのメモ、日常のメモとか。

SQL カラムのスキーム変更方法

カラム追加

ALTER TABLE [テーブル名] ADD [カラム名] [データ型];

カラム変更

ALTER TABLE [テーブル名] CHANGE [旧カラム名] [新カラム名] [データ型];
  • データ型変更
ALTER TABLE [テーブル名] MODIFY [カラム名]  [新しいデータ型];

カラム削除

ALTER TABLE [テーブル名] DROP [カラム名];

NULL制約について

後ろにNULLまたはNOT NULLをつける。

ALTER TABLE [テーブル名] ADD [カラム名] [データ型] NOT NULL;

MySQL操作カンペ

MySQLで良く使いそうなコマンド。

MySQLの起動

mysql.server start
mysql -uroot -p
# パスワードを入力

データベースの操作

  • データベースの作成
mysql > create database DB名;
  • データベース一覧表示
mysql > show databases
  • データベースの選択
mysql > use DB名

テーブルの操作

  • テーブル一覧表示 DBを選択した状態で。
mysql > show tables;
mysql > desc テーブル名;

*テーブルの構造表示

mysql > how table status like 'テーブル名'\G
  • テーブルのコピー
mysql > create table コピー先テーブル名 select * from コピー元テーブル名;

webpackを使用したReact.jsのjsxのビルド

React.jsで使用するjsxのビルド方法について調べた。
web packを使用すると良さそう。

webpackとは

必要なリソースの依存関係を解決し、アセット(配布物)を生成するビルドツール、らしい。
jsxは、普通にも使用できるが、コンパイルをかけないと遅いようなので、
webpackを使用してコンパイルする。

要npm。
npmについてはこちらを参照。

www.atmarkit.co.jp

webpackの導入

まずはnpm initをし、web packのインストール。
インストール時に--save-devオプションを付ければ、package.jsonに自動的に追記されます。

npm init
npm install webpack babel-loader babel-core babel-preset-es2015 --save-dev

babelはjsxのビルドに必要。
その他の項目はjsxを正常にビルドできなかったので調べて追加した。
web packは、ビルドしたいコンポーネントに応じて**-loaderをインストールする必要あり。 同じディレクトリ内にビルド設定ファイル、webpack.config.jsを作成し、中身を以下のようにする。

module.exports = {
  // ビルド対象のファイルのパス
  entry: __dirname + "/src/main.js",
  // ビルド後のファイルパス
  output: {
    path: __dirname + "/dist",
    filename: "like-button.js"
  },
  // 各種loaderの設定
  module: {
    loaders: [
      {
        // .js拡張子のファイルのビルド設定
        test: /\.js$/,
        exclude: /node_modules/,
        loader: "babel-loader",
        query:
          {
            presets: ['es2015', 'react']
          }
      }
    ]
  }
};

これで、ターミナル上でwebpackコマンド実行でビルドが走る。
npm のビルド設定にwebpack のビルドを追加しておくと良い。
package.jsonに以下の内容を追加。
npm run buildとnpm run watchにwebpackコマンドを関連付けさせる。

  ...
  "scripts": {
    ...
    "build": "rm -rf dist/.*js && webpack",
    "watch": "rm -f dist/.*js && webpack -w"
  },
...

あとはnpm run watchとしておけば、ファイルに変更があった際にビルドが走る。

FactoryGirlを使用したデータの作成

Gemのインストール

Gemfileに以下を追加し、bundle installを実行する。
RSpecを使用することを前提に書くのでRSpecも一緒にインストールしておく。

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
end

bundle install後にrspecのインストールをする。

rails g rspec:install

ここでうまくいかないときはspringが悪さをしているので、一度停止させておく。

spring stop

インストールが完了したら、再起動させる。

spring binstub

FactoryGirlのインクルード

インクルードしておいたほうが、FactoryGirlのメソッドを使用する際に、
クラス名を省略できる。

#spec/spec_helper.rb
RSpec.configure do |config|
  # FactoryGirlのインクルード
  config.include FactoryGirl::Syntax::Methods

Factoryファイルの作成と使用

spec/factoriesディレクトリを作成し、対象のモデル名のファイルを作成する。

# productモデルのFactoryファイル(spec/factories/product.rb)
FactoryGirl.define do
  # product レコードの登録用ファクトリー
  factory :product do
    # 名前は複数回実行されることを想定してかぶらないように連番設定する
    sequence(:name)  { |n| "MyProduct#{n}" }
    price 100
    category_id 1
  end
end

作成したFactoryは以下のように使用する。

  # 例としてテスト時にFactoryGirlでデータを作成させる。

  describe "GET /products.json" do
    # テスト前にFactoryGirlでテーブルにデータを登録しておく。
    # create_listは第2引数の数だけデータを作成する。
    # spec_helper.rbにてFactoryGirlをインクルードしているため、create_listだけで使用できる。
    before { @products = create_list(:product, 2) }

    example "一覧情報を取得できること" do
      # GET /products.json にアクセスする
      get api_v1_products_path format: :json

      # ステータスコードの確認
      expect(response.status).to eq 200

      # JSONの確認
      json = JSON.parse(response.body)
      expect(json.size).to     eq @products.count
      expect(json[0]["id"]).to eq @products[0].id
      expect(json[1]["id"]).to eq @products[1].id
      # 詳細の値の確認は省略
    end
  end

その他FactoryGirlの便利な使い方は、以下の記事を参照。

ruby-rails.hatenadiary.com

Railsでjsonを返却するAPIを作成する。

Railsjsonを返却するAPIを作成するには、Jbuilderが良さそう。

まずはモデル作成

rails g scaffold Product name:string price:integer category_id:integer

API用のルーティング設定

config/routes.rbをいじり、API用のルーティングを設定する。
APIにはバージョニングをするのが一般的らしい。

Rails.application.routes.draw do
  # json として返却させるようにformatを指定
  namespace :api, {format: 'json'} do
    # リソースのバージョニング
    namespace :v1 do
      resources :products
    end
  end
  # 以下省略

返却するjsonデータの編集

viewsにindex.json.jbuilderが作成されているので、中身を編集。

json.array!(@products) do |product|
  # product一覧のid, name , priceを取得する
  # => [{id: 1, name: "TEST", price: 100, category_id: 1}, ...]
  json.extract! product, :id, :name, :price, :category_id
end

jbuilderの詳しい関数に関しては、以下のページを参照。

github.com

jbuilderファイルとコントローラーファイルの配置場所を変更

routes.rbを編集したので、app/views/api/v1ディレクトリと、
app/controllers/api/v1ディレクトリ作成し、
views/products以下全てと、controllers/products_controller.rbを
それぞれのディレクトリに移動させる。
products_controller.rbは、namespaceが変わるため、クラスにモジュール名を設定する。

module Api
  module V1
    class ProductsController < ApplicationController

以上でOK。

補足

モデルには、to_jsonメソッドが用意されており、
render メソッドの第2引数に、 :jsonを設定すれば、json値として返却するようになる。

Railsでタグ機能を実装する。

Railsでデータにタグ付けさせる昨日の実装方法について調べた。 acts-as-taggable-onというGemを使えば良さそう。

インストール

まずはbundle installでGemをいれる。

gem 'acts-as-taggable-on', '~> 3.4'

タグ付けに必要なテーブルを作成。

tomy2002:~/workspace $ rake acts_as_taggable_on_engine:install:migrations
tomy2002~/workspace $ rake db:migrate

使い方

モデルへの設定

タグ付けしたいモデルに、acts_as_taggableを宣言

class LiveHouse < ActiveRecord::Base
  # タグ機能の実装
  acts_as_taggable_on :labels # post.label_list が追加される
  acts_as_taggable            # acts_as_taggable_on :tags のエイリアス
end

こうすることで、live_house.tag_listや、live_house.label_listというメソッドを使用することができる。

タグの登録・取得・削除

# タグの登録
live_house.tag_list.add("Rock")  # "Rock"タグを追加する
live_house.tag_list.add("Rock", "Pops") # 複数のタグを追加する

# タグの取得
live_house.tag_list #["Rock", "Pops"]を取得

# タグの削除
live_house.tag_list.remove("Rock") # "Rock"タグを削除する
live_house.tag_list.clear                 # すべてのタグを削除する

# 最も使われているタグを配列で取得
ActsAsTaggableOn::Tag.most_used #引数を省略するとデフォルトで20件まで取得する。
ActsAsTaggableOn::Tag.most_used(3)

# 最も使われていないタグを配列で取得
ActsAsTaggableOn::Tag.least_used
ActsAsTaggableOn::Tag.least_used(3)

# RockのタグがつけられているLiveHouseを取得する
live_house = LiveHouse.tagged_with("Rock")

# RockとMetalタグがつけれれているPostを取得する
# :match_all (AND条件), :any (OR条件), :exclued (NOT条件)が使える
model = LiveHouse.tagged_with(["Rock", "Metal"], match_all: true)

# 同じタグを持ったレコードを検索する
model.find_related_skill #=> [<Post ...>, <Post ...>]

Veiw側の設定

%= form_for(@user) do |f| %>
  ...
  <div class="field">
    <%= f.label :name, "名前" %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :tag_list, "タグ(カンマ区切り)" %><br>
    <%= text_field_tag 'user[tag_list]', @user.tag_list.join(',') %>
  </div>

コントローラーは、StrongParameterで入力されたタグを取得する。

# app/controllers/users_controller.rb
def user_params
  params.require(:user).permit(:name, :tag_list)
end

ユーザのタグ登録を楽にするには

QiitaとかWontedlyに良くある、タグに×ボタンがついてるやつ。
以下の外部ライブラリのどちらかで対応できそう。

github.com

github.com

その他細かい部分は以下の記事を参照。

ruby-rails.hatenadiary.com 9bar.tokyo