投稿

9月, 2016の投稿を表示しています

Railsでreferencesを使用した外部キーに、同時にUnique属性を設定する

イメージ
Railsで新しいモデル(テーブル)の作成で外部キー(外部参照)を設定する時に、 同時にユニーク属性を設定していく手順を記載します。 余り使う機会はないかもしれませんが、今回は以下の例を使っていきます。 (例)Userが複数のOrganizationに所属できる多対多の関係で、そのうちの一のOrganizationをデフォルトとして保持するDefaultOrganizationテーブルを作成する場合。    以下がER図です。 試行錯誤して結果を得たので、経過も踏まえて記述します。 解答に書いている事がやり方なので、手早く正解が欲しい方はそちらをご覧下さい。 なぜ必要なのか 使用しているDBにもよりますが、先に出した例であれば、中間テーブルにデフォルトフラグ的な項目があれば良いと思います。 しかし、それだとDefaultOrganizationはユーザーにつき1つだけというユニーク属性(一意制約)を設定できない場合があります。 アプリ側で制限したら良いよってポリシーの場合は特段ここまで考える必要はありませんが、 DBのリレーションまでキチンと設計しておきたい場合、PostgreSQLやMySQLであれば部分インデックスで可能ですが、OracleやMySQLだと部分インデックスが使えないって制限があります。 そういった場合に使えるかと思います。 なお、中間テーブルと、中間テーブルのフラグについては、こちらに書きました。 www.techbox.jp 普通に外部参照だけをする場合 マイグレーションファイルを作成します。 rails g migration CreateDefaultOrganization user:references relation:references ※この時に、userとorganizationにidを付与しません。  referencesにした場合、勝手に補完されますので、モデル名だけで良いです。 すると、以下の様なマイグレーションファイルが作成されます。 class DefaultOrganization < ActiveRecord::Migration def change create_table :default_organizations do

has_many :throughな多対多のリレーションから、中間テーブルの項目を使って1レコードを取得する

イメージ
今回はRubyOnRailsでのActive Recordのアソシエーションの話です。 ユーザーが複数の組織に所属可能っていうシステムを作っていく時に、ユーザーのデフォルトの組織を設定したり、 逆に組織に対して代表者を1人決めたいって状況があると思います。 そんな時、中間テーブルのステータスなりフラグを使って1レコード絞って表示したいと思ってやってみると、 案外どーやるんだろ?ってなったりします。 そんな時の自分なりのやり方。 多対多のリレーションとは 多対多の関係とは、お互いのテーブルのレコード同士が複数の相手側レコードと関連付けられる関係の事。 例を出さないと難しいので、最初に例を挙げて、その例に沿って書いていきます。 (例)UserとOrganizationの関係 Userは複数のOrganizationに参加が可能で、Organizationには複数のUserが参加している状況の場合、 1Userから見てOrganizationは多であり、1Organizationから見てUserは多になります。 当然ながら、1対1だと自分のレコードに紐付く相手のIDを記載したら良いけど、 複数に紐付く場合はこのやり方では無理になります。 その分レコードを増やしてしまうと、同じUserが何人もいる事になってしまったりするし、 その分テーブルの項目を作るって事であれば、上限が出来てしまいます。 中間テーブルを作る この状態を上手い事する為に、中間テーブルを用意します。 中間テーブルにはUserのIDとOrganizationのIDを保持するだけ。 UserとOrganizationの紐付きが増えれば、その分レコードが追加される。 こんな感じ。 これをRailsのmodelに記述すると、以下の通りとなります。 project/app/models/user.rb class User < ActiveRecord :: Base has_many :relations has_many :organizations , through : :relations project/app/models/organization.rb class Organization

GitHubにカンバン方式のプロジェクト管理が導入された話

イメージ
GitHubでは、様々なサードパーティー製のサービスが連携できます。 TrelloとかJiraとか優秀なプロジェクト管理サービスも連携出来ていて、それらを使っていた事も多かったと思います。 今回のアップデートで、GitHubでもプロジェクト管理が出来るようになりました。 GitHubにプロジェクト管理が導入 GitHubのプロジェクト管理ですが、以下のような画面から始まります。 他のツールと同じく、ボードを好きに作って、カンバン方式でタスクを貼り付けていく感じです。 早速使ってみる プロジェクト管理はProjectという名前です。※そのままです。 リポジトリ単位で作られていくので、この機能を使いつつ他人に見られたくないって場合は、 有料プランかOrganizationでするしかないです。 リポジトリに入ってプロジェクトを作成する 「Project」というタブが新たに増えています。 ここから「Create project」していきましょう。 プロジェクトの名前と説明を記載して作っていきます。 一つのリポジトリの中に、複数のプロジェクトを作成できます。 ベータ版リリース、正式サービス開始、とかに区切って作成して行く感じでしょうか。 カラム(リスト)の追加 プロジェクトが出来たら、次はカードを分類するカラムの追加をしていきます。 カラムとは、Trelloでいうリストの事で、所謂カードの分類になります。 今回は ToDo、Doing、Done(やる事、やってる事、終わった事)で作成しました。 「Add column」で追加して下さい。 カードの追加 タスクです。カードを追加していきましょう。 追加する分類のカラムの+マークを押すと「Enter a note」が出てきます。 タスクを入力して、「Add note」をしていきます。 これだけ。 ここまでは単純なカンバン作成でした。 ただ、このProjectだけでは本当にテキストエリアに文字を入れるだけなので、Trelloなどの外部ツールとは比べ物になりません。 GitHubは元からIssuesという機能を持っています。 これと連携していく事になります。 このカードに書いた事は、Issuesのタイトルになる事となります。

ブラウザで動くIDE Eclipse Che のインストール

イメージ
Eclipseが次世代のIDEとしてEclipse Cheをリリースしました。 AceやCloud9のように完全にブラウザで完結します。 ブラウザでコーディングをして、そのままテスト稼働が可能なツールです。 実際の所、たまに変な動作をしたりするので…って所はありますが、 ペアプログラミングを行ったりする時には重宝しそうな気がします。 前置き なぜこれをしたくなったかなど、私見です。 読み飛ばして頂いても全く問題ないです。 Google cloud platform や AWSが当たり前になってきて、サーバーはクラウド化、 GitHubなんかも当たり前に使われてきて、ソース管理もクラウド化、 スゲーどこでもコーディング出来んじゃんって思ってたけど、よくよく考えれば PCは依存するよねって常々思ってて。 確かに仮想デスクトップとか使えばって意見も凄く分かるけど、 やっぱりどうせならブラウザで動くと格好良いんだな。 って事で探してて、最近気になったのが「 Eclipse Che 」 JavaでもPHPでもRailsでもGoでもスグに開発環境を使えるって優れもの。 ブラウザで動作するIDEで、凄く未来を感じる次世代のツール。 これを今回は立ち上げて行きます。 Linuxに1から構築したりするのが結構大変だったので、 動作させるまでがメチャクチャ簡単な手法で立ち上げたいと思います。 動作環境 VMware workstation VMware ESXi VirtualBox AWS GCP 基本的にどれでも大丈夫ですが、今回はESXiを使ってます。 導入 仮想マシン導入 まずは仮想環境にEclipse Cheの仮想マシンを導入していきます。 仮想基盤は導入済みが前提です。 まだな方は、「Virtual Box インストール」で検索して下さい。 bitnamiからイメージのダウンロード まずは bitnamiのEclipse Cheページ にアクセスします。 ※始めて使う人はユーザー登録を求められるので、新規で作成もしくはSSOでログインして下さい。 OVAダウンロード 画面したの方のVirtual Machinesから、ovaをダウンロードをします。 ESXi(仮想環境)にデプロイ ESXiにv

Railsのプロジェクト名と、GitHubのリポジトリ名を変更する

イメージ
Ruby on Railsでrails newした後に、やっぱりアプリ名(プロジェクト名)を変更したい!って思った時、 ついでにもうGitHubにプッシュしちゃったんだけど…って場合もあると思います。 そういった場合の、Railsプロジェクト名の変更方法と、GitHubのリポジトリ名の変更方法を記載します。 もちろん、両方変更も可能です! 手順 rails側の変更 まずはソース3箇所を書き換えます。 +が追加行で、-が削除行です。 config/initializers/session_store.rb - Rails .application.config.session_store :cookie_store , key : ' _oldproject_session ' + Rails .application.config.session_store :cookie_store , key : ' _newproject_session ' config/application.rb - module Oldproject + module Newproject app/views/layouts/application.html.erb - <title> Oldproject < / title> + <title>Newproject< / title> #これは表示だけなので、別に変えなくても良い 次に、DB名も変えるのであれば、接続文字列も変更します。 config/database.yml database : oldproject_development database : newproject_development 続いて、このプロジェクトのフォルダ名をエクスプローラーから直接変更します。 通常のフォルダ名変更手順で問題ないです。 oldproject/app.... newproject/app... GitHub まずはリモートリポジトリ名を変更します。 リポジトリのページ>Settings>Repository name ここにnewprojectを入力