MySQL操作カンペ
MySQLで良く使いそうなコマンド。
MySQLの起動
- MySQLの起動
mysql.server start
- MySQLの使用
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についてはこちらを参照。
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の便利な使い方は、以下の記事を参照。
Railsでjsonを返却するAPIを作成する。
Railsでjsonを返却する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の詳しい関数に関しては、以下のページを参照。
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に良くある、タグに×ボタンがついてるやつ。
以下の外部ライブラリのどちらかで対応できそう。
その他細かい部分は以下の記事を参照。
使わなくなったGemをアンインストールする
アンインストール方法。
tommy1218:~/workspace $ bundle exec gem uninstall アンインストール対象のGem
あとは、GemfileからアンインストールしたGemを削除すればOK。