Ruby Association Certified Ruby Programmer Gold に合格しましたよ。

Ruby Association Certified Ruby Programmer Gold に合格しましたよ。
結果 :80点/100点 (合格ライン:75点)


GoldはやっぱりGoldです。難しかったです。シルバーと全然違います。


実は、一発合格した訳ではありません。3回目でやっと合格です
一回目:68点  「ま〜、簡単だろう〜と思って気軽く受けてみたが、不合格」
二回目:70点 「問題集をちゃんとやっておけば合格だろうと思って受けてみたが、同じ結果、不合格」(このときは、さすが自信がなくなってきた。)
三回目:80点  「object指向の基礎を何回も復習して、試験に向かった。合格。」「細かいところはみていない。文字列など、配列、ハッシュなど」


合格まで、時間長かったな〜。すぐ取れる資格だと思いました。



合格してわかったこと。
・受ける価値がありました。実用性がある問題、rubyの全体を理解できるふさわしい資格だと思いました。
・あいまいな所がはっきりわかるようになりました。「細かいところではなく、Ruby言語の全体仕様を」
・合格するにはやっぱり PC「 irb 」で入力して、確実把握しておいたほうがいいことがわかった。
・合格するには一番大事な所はオブジェクト指向の部分の基礎をしっかり把握することが大事。今回受けて、8割がオブジェクト指向の問題でした。
  その中で、メソッド探索、定数の探索、メソッドの可視性、Object ,Class ,Module の相互関係、
  あと、無視できない問題、毎回でました。それはマーシャルとThread問題、それに関しては基本だけ暗記しておけばOKです。


やっと、社長から、資格代(1.5万)を請求できる。hahaha

[]Rails で十分に活用されていなくてもったいない ActiveRecord::Relation のメソッド TOP 10

これはすごい、全然使える。。。。。。。。。。
http://d.hatena.ne.jp/suginoy/20120605/p3


Myメモ


10位 ブロック付きの first_or_create

Book.where(:title => 'Tale of Two Cities').first_or_create
Book.where(:title => 'Tale of Two Cities').first_or_create do |book|
  book.author = 'Charles Dickens'
  book.published_year = 1859
end

9位 first_or_initialize

Book.where(:title => 'Tale of Two Cities').first_or_initialize

8位 scoped

def search(query)
  if query.blank?
    scoped
  else
    q = "%#{query}%"
    where("title like ? or author like ?", q, q)
  end
end

7位 none ( Rails 4 のみ)

def filter(filter_name)
  case filter_name
  when :all
    scoped
  when :published
    where(:published => true)
  when :unpublished
    where(:published => false)
  else
    none
  end
end


6位 find_each

Book.where(:published => true).find_each do |book|
  puts "Do something with #{book.title} here!"
end


5位 to_sql と explain

  Library.joins(:book).to_sql
  # => SQL query for you database.
  Libray.joins(:book).explain
  # => Database explain for the query.

4位 find_byRails 4 のみ)

Book.where(:title => 'Three Day Road', :author => 'Joseph Boyden').first

代わりに

Book.find_by(:title => 'Three Day Road', :author => 'Joseph Boyden')


3位 scoping

Comment.where(:post_id => 1).scoping do
  Comment.first # SELECT * FROM comments WHERE post_id = 1
end


2位 pluck

published_book_titles = Book.published.pluck(:title)


1位 merge

class Account < ActiveRecord::Base
  # ...

  # Returns all the accounts that have unread messages.
  def self.with_unread_messages
    joins(:messages).merge( Message.unread )
  end
end

deviseを使っている途中に気になっているところ。

deviseを使ってみるとログイン機能のコントローラーは以下のようになっている。


class SessionsController < Devise::SessionsController
~~~~~~~~~~~~~~~~
end
SessionsController はdeviseのDevise::SessionsControllerを継承しているから、
ApplicationControllerに書いたロジックは実行しないのではと思うだろう。

deviseの中身をちょっと調べたいかのソースコードを見つかりました。


8 module Devise
~~~~~~~~~~~~~~~~
201 # The parent controller all Devise controllers inherits from.
202 # Defaults to ApplicationController. This should be set early
203 # in the initialization process and should be set to a string.
204 mattr_accessor :parent_controller
205 @@parent_controller = "ApplicationController"
206
207 # The parent mailer all Devise mailers inherit from.
208 # Defaults to ActionMailer::Base. This should be set early
209 # in the initialization process and should be set to a string.
210 mattr_accessor :parent_mailer
211 @@parent_mailer = "ActionMailer::Base"
~~~~~~~~~~~~~~~~
460 end

うん〜〜〜
なるほど、ちゃんと作っているじゃ〜
継承しているね。
心配なくApplicationControllerはアプリのすべてのcontrollerを継承していると思っていても構わないね。

railsのすごさを感じた!!!


railsすごさを感じた!!!

いったい何がすごいの?

最近、仕事で、データ移行するときにすごく役に立った。

古いテーブルから、新しいテーブルにデータを移行することがあって、
そのまま移行するとだめので、
データの正当性、関連性を全部checkして
正しいデータに変更後に移行しないいけないのだ。


railsにはrakeコマンドで実行できるTaskスクリプトを作ることができる。
そのTaskにはrailsのmodelのメソッドのそのまま使える。なので、rakeコマンドでview側で
できる機能をすべて実行することができる。

ビジネスロジックをmodelに集中しておくのが前提、
あとはコントローラーできるだけ、シンプルにすること。
まあ〜、Railsとっては当たり前だけとね」

なので、モデルの機能を使って、正しいデータに変更して、
新データベースに入れるできた(validationとか全部checkしてくれるからね)。
つまり、安全にデータ移行ができるのが
Railsのモデルのすごいところだ。

以上、私の感想です。

deviseのパスワードの移行するには


認証用のGEM形式のライブラリdeviseは、railsの好きな人はだれでも知っている。
deviseを導入することで、ユーザーを管理するusersテーブルにいろんなカラムが追加される。
もちろん, Userモデルに設定によりますけど、emailとpasswordを使うのが一般的である。




もし、なんらかの原因でusersテーブルを移行したい場合はどうすればいいのか?しかも、
すでに存在してる別のusersテーブルに統合したいリクエストがきたい場合はどうすればいいのか?
もちろん、統合した後にemailとpasswordのそのまま使えないといけないのだ。




usersのテーブルをみるとemailカラムは存在しているけど、passwordというカラムは存在しているない。
usersのテーブルのすべての情報をそのまま全部移行すれば問題ないけど、emailとpasswordとだけ移行したい時には

以下のカラムだけ、もっていけば大丈夫だと思います。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
emailカラムと
password_saltカラムと
encrypted_passwordカラムだけ
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー



しかし、保存するときにpassword_saltカラムとencrypted_passwordカラムに対して、save!実行すると
エラー発生します。「Can't mass-assign protected attributes: password_salt、 encrypted_password」
こいうカラムはformからの更新は許可していないからです。許可したら危険ですから、


回避方法:


u = User.new
u.email="xxxxxx@xxxxxxxx"
u.password_salt = "xxxxxxxxxxxxxxx"
u.encrypted_password="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
u.save!(:validate=>false)


これでパスワードをそのまま使えるぜーーー

以上|||||

ActiveRecord::Base::transactionはrollbackされない。

データベース内の情報の整合性を保つためにtransactionを使うわけだ。
しかし、エラーが発生したら、rollbackされないと意味がない。




しかし、はまってしまう罠がある。
http://underrails.seesaa.net/article/54762314.html
returnを使うケースもそうだし、
begin ~ rescue ~ end使うケースもrollbackがされない。

明示的 raise を使って例外発生する必要がある。
http://www.fraction.jp/log/archives/2008/02/21/ActiveRecord_de_rollback

知らなかった、ActiveRecordの継承したmodelの親クラスをつくることもできるんだ。

たまにすべてのモデルに対して、共通の処理を作るときに

include モジュール形式もいいのだが、
ActiveRecordを継承を利用する場合もある。

このときには
これの出番


self.abstract_class = true


資料:
http://blog.koreboku.com/entry/20070829/1188374937
へ〜、そうなんだ。