Rails5のignored_columnsで予約語のエラーを回避する

こんにちは、SHOYANです。

Railsには様々な予約語がありますが、歴史の長いシステムを扱っているとDBのカラムがその予約語に該当する場合があります。
例えば classというカラム名があった場合、そのカラムの影響で以下のエラーが発生します。

1
2
pry(main)> User.all.first
NoMethodError: undefined method `fetch_value' for nil:NilClass

これを回避する方法の1つがDBのカラム名の変更です。
しかし、DBのカラム名の変更は様々な影響が考えられるため簡単に変更できない場合があります。

その場合はアプリケーション側で回避します。

Rails5のignored_columnsで予約語のエラーを回避する

Rails5で追加された ignored_columns を使えばこのカラム自体が無視されるようになり、エラーを回避できます。

1
2
3
class User < ApplicationRecord
self.ignored_columns = %w(class)
end

Rails4であれば以下で同様のことができるようです。

1
2
3
4
5
6
7
class User < ActiveRecord::Base

def self.columns
super.reject {|column| column.name == 'class'}
end

end

ignored_columnsで防げないパターン

ただし、ignored_columns でも完全に防げない場合があります。

to_json メソッドでエラーが発生します。

1
2
pry(main)> User.all.to_json
SystemStackError: stack level too deep

この場合は、except オプションで回避できます。

1
User.all.to_json(except: [:class])

今回の場合は、classカラム自体が不要だったので ignore_columns で対応しました。
classを使いたい場合は、どのように回避すればいいんでしょうか。。。

どなたか知っている人がいれば情報をいただきたいです。

Twitterカードをサイトに設定する手順

Twitter_Logo

Twitterカードとは

Twitterカードはタイムラインに表示される情報をカスタマイズできる機能です。
Twitterカードを設定することでタイムラインに表示される情報をよりリッチなものにすることができます。
現在はSNSにより拡散されることも多いため、Twitterカードの設定をしておくとより多くの人の目にとまるようになり、記事への流入が期待できます。

Twitterカードを設定すると以下のようになります。

introduce_twitter_card_01

Twitterカードの設定

Twitterカードの設定手順を紹介します。

タグを設定する

Twitterカードのを利用するためにはメタタグの設置が必要です。
以下は30歳から始める数学に設定しているTwitterカードのサンプルコードです。

Sample Code

1
2
3
4
5
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@sinn_shoyan" />
<meta name="twitter:title" content="30歳から始める数学" />
<meta name="twitter:description" content="とあることから、30歳にして数学を学び始めました。いまは毎日楽しく数学の書籍を読んだり方程式を解いたりしています。本記事では、僕と同じようにもう一度数学を学びたいなと思っている人向けに、数学の魅力を再発見する方法を紹介します。" />
<meta name="twitter:image" content="http://48n.jp/images/math-1547018_640.jpg" />

Twitterカードのメタタグのプロパティは以下となります。

プロパティ 必須 説明
twitter:card Yes twitterカードの種類を設定します
twitter:site No twitterの@usernameを設定します
twitter:title Yes 記事のタイトルを設定します
twitter: description Yes 記事の説明を設定します
twitter:image No 画像を設定します。サイズは横幅280px以上 × 縦幅150px以上です。サイズは1MB以下でないといけません。

他にも設定できるオプションがありますが長くなるのでここでは割愛します。
詳しくはドキュメントを参照してください。

Twitterが提供しているCard Validatorで申請を行う

Twitterカードを有効にするにはTwitterが提供しているCard Validatorで申請を行う必要があります。
こちらの作業は1度行えば今後は必要ありません。

テキストフォームに確認したいページのURLを入力します。
エラーがなければ以下のように表示され、Twitterカードが有効になります。

introduce_twitter_card_02

一度認証が成功するとそのドメインでTwitterカードの利用が有効となります(サブドメインも含む)。

Twitterカードの種類

最後にTwitterカードの種類を紹介します。
仕様変更が行われたようで、現在は以下の4つのTwitterカードが利用できます。

  • Summary Card
  • Summary Card with Large Image
  • App Card
  • Player Card

Summary Card

URLの概要をまとめて表示してくれるTwitterカードです。

summary_card_example

Summary Card with Large Image

Summary Cardとほとんど同じですが、画像がより大きなサイズで表示されます。

summary_card_with_large_image_example

App Card

モバイルのアプリを紹介するためのTwitterカードです。ダウンロードリンクも表示されます。

app_card_example

Player Card

ツイートに動画、オーディオを埋め込めるTwitterカードです。

player_card_example

おわりに

以上がTwitterカードの導入に関する説明となります。
Twitterカードについての詳しい情報は公式ドキュメントをご覧ください。
また、Twitterカードの設置に関して疑問点などあれば、ブログのコメント欄やTwitterでお気軽にご連絡ください。

Rails5からbelongs_toアソシエーションの挙動が変わった

Rails5から belogs_to アソシエーションの挙動が変わった。

親モデルに属している子モデルは親モデルの外部キーが存在しないとバリデーションエラーになるのがデフォルトの挙動となっている。
参照先レコードのidをnullで登録しようとした場合は以下のようなバリデーションエラーが出る。

1
ActiveRecord::RecordInvalid: Validation failed: Post  must exist

DHHの一声で belogs_to の挙動が変わる様が垣間見れるイシュー。

DHHの言い分としては「普通 belongs_to って、参照先テーブルのIDは必ずもってるだろ。ならデフォルト required: true でよくね?」という話。

この挙動をRails4と同じにしたい場合は optional: true を使う(required: false は廃止予定なので使わないほうがいい)。

1
2
3
4

class Post < ApplicationRecord
belongs_to :article , optional: true
end

belongs_to のオプションの詳細については以下のドキュメントで参照できる。

4億円調達したゼロアグリと農業の未来

Iotの技術を使ったゼロアグリを開発しているルートレック・ネットワークスが4億円の資金調達をした。
ゼロアグリは農作物の水や肥料の管理を独自のアルゴリズムとIoTの技術を使って機械化する取り組みを行っている。

私は農業とIoTの分野に大きな可能性を感じておりウォッチしているのだが、ゼロアグリのように進めているところはしっかり進めているように感じる。
まだまだ開発段階のものが多いが10年後には実用化レベルに達するものが結構出てくると思っており、新しい農業の形が形成されていくのではと思う。

ゼロアグリの佐々木氏は「農場に関するデータを可視化するものだけだと農家に受け入れられなかった」と語っているが、まさにその通りだと思う。
農業は数値ではなく感覚で判断するものだと思う。
そこにいきなり数値が出てきても受け入れられるのはなかなか難しいだろう。

私は家庭菜園をしているが、土がよければ放っておいても野菜は育つ。
そういうものだから、土の水分や養分をモニタリングしてもあまり意味がない。

じゃあ、何が必要かというと、目の前の農家が困っていることを解決出来る仕組みだと思う。
その問題を解決するにあたってどうしても物理的に制御が必要なものが出てくるはずだ。
IoTの技術の進化でその技術を多くの人が使えるようになってきている。
実際に困っていることを解決するためのものをそこらの人が作る。
そういうことができる時代がやってきていることに可能性を感じる。

私の友人は農家をやっているが、有機農法なので除草に手間がかかっているようだ。
その除草の手間をIoTの技術を使って軽減できないだろうかと考える(いいアイデアはない)。
また配達が手間のようなので、配達の手間を省けるような仕組みを考えるといいかもしれない。
例えばドローンを使って郵送するとか。
実際やろうとしたらものすごく大変そうだけど(野菜って重いんですよね)。

世界で最も成長しているのは中国じゃなかったと数値が教えてくれた

THE WORLD BANKという世界の様々なデータを公開しているサイトがあります(最近知りました)。
何気なく普段のニュースに触れていると世界で最も成長しているのは中国だという印象があります。
しかし、データを見るとそうでないことが明らかになります。

では、国の経済成長の指標であるGDPを見ていきます。

2015年のGDPの伸び率トップ10

  1. アイルランド 26.3%
  2. West Bank and Gaza(ヨルダン川西岸地区) 12.4%
  3. エチオピア 9.6%
  4. パラオ 9.4%
  5. コートジボワール 9.2%
  6. ウズベキスタン 8.0%
  7. インド 7.6%
  8. ラオス 7.4%
  9. ミャンマー 7.3%
  10. ドミニカ共和国、コロンビア、 タンザニア 7.0%

「あれ、中国がいない?」と多くの日本人は思うのではないでしょうか。
中国のGDPは6.9%で11位です。
ちなみにGDP成長率6.9%の国はコンゴやルワンダがあります。

あれだけ景気の良いと言われている中国以上に成長している国があるのですね(最近は危ぶまれる声も聞きますが)。

ちなみに1位のアイルランドは26.3%と尋常ではない伸び率です。
この要因は一体何なんでしょうか。

調べてみたところ、アイルランドは法人税が安く、そのために本社を移転してくる会社が多いとのことです。

アイルランドには12・5%と低い法人税率を目当てに多国籍企業が合併・買収(M&A)などを通じて本社を移転してくるケースが多い。同国の資産は統計上かさ上げされ、先進国では異例の“高成長”につながった。

http://www.sankei.com/economy/news/160713/ecn1607130011-n1.html

アイルランドに本社移転した会社の資産がアイルランドのGDPに反映され、このように異常に高い数値として出ているようで、実際の経済成長とは乖離しているというのが識者の認識のようです。

我らが日本のGDP成長率はいくらかというと0.5%です。
マイナス成長している国も少なからずあるのでマイナスじゃないだけマシかもしれません。
日本の高度経済成長期のGDP成長率は8%〜12%で推移しています。

ワールドカップとオリンピックで沸いたブラジルはマイナス3.8%成長で、大きくこけている感じがありますね。

ちなみに地域では南アジアの成長率がすごくて7.1%でした。

南アジアの国々

south-asia-gdp

高度経済成長期の日本のように成長している国があるという事実に、世界は広いなと感じます。

また、こういう数値を認識せずに中国が最も経済成長しているなどの誤った認識を持ってしまう事は避けたほうが良いと思いました。