ActiveRecord
ActiveRecordはRuby on Rails用のO/RマッパーでObjectとRelational DataBaseのやり取りをマッピングする。
Active Recordには、モデルとデータベースのテーブルとのマッピング作成時に従うべきルールがいくつかあります。Railsでは、データベースのテーブル名を見つけるときに、モデルのクラス名を複数形にしたものを使用します。つまり、Bookというモデルクラスがある場合、これに対応するデータベースのテーブルは複数形のbooksになります。Railsの複数形化メカニズムは非常に強力で、不規則な語であっても複数形にしたり単数形にしたりできます(person <-> peopleなど)。モデルのクラス名が2語以上の複合語である場合、Rubyの慣習であるキャメルケース(CamelCaseのように語頭を大文字にしてスペースなしでつなぐ)に従ってください。一方、テーブル名は(camel_caseなどのように)小文字かつアンダースコアで区切られなければなりません。以下の例を参照ください。
データベースのテーブル - 複数形であり、語はアンダースコアで区切られる (例: book_clubs) モデルのクラス - 単数形であり、語頭を大文字にする (例: BookClub) モデル / クラス テーブル / スキーマ Post posts LineItem line_items Deer deers Mouse mice Person people
データベースのテーブル - 複数形であり、語はアンダースコアで区切られる (例: book_clubs)
モデルのクラス - 単数形であり、語頭を大文字にする (例: BookClub)
オブジェクトとの連携
#posts.sqlite create table posts ( id integer primary key autoincrement, title text, body text, created_at, updated_at );
#main.rb require 'active_record' #データベースとの接続 ActiveRecord::Base.establish_connection( "adapter" => "sqlite3", "database" => "./blog.sqlite" ) class Post < ActiveRecord::Base end
レコード挿入
#main.rb ##接続部分省略 post = Post.new(title: "Hello", body: "aaaaa") post.save post2 = Post.new post2.title = "second" post2.body = "Yeah" post2.save post3 = Post.new do |p| p.title = "post3" p.body = "bodybody" end post3.save post4 = Post.create(title: "post4", body: "saddasaaa")
データ抽出
#main.rb ##接続部分省略 ###すべてのレコード p Post.all ###最初のレコード p Post.first result=> :> ruby main.rb #<Post id: 1, title: "Hello", body: "aaaaa", created_at: "2015-04-14 17:10:57.750168", updated_at: "2015-04-14 17:10:57.750168"> ###最後のレコードとそのタイトル p Post.last.tilte (フィールド名) result=> :> ruby main.rb 17 ###条件から探す(find) p Post.find(3) =>result :> ruby main.rb #<Post id: 3, title: "Hello", body: "aaaaa", created_at: "2015-04-14 17:14:18.772831", updated_at: "2015-04-14 17:14:18.772831"> p Post.find_by_title("second") :> ruby main.rb #<Post id: 9, title: "second", body: "Yeah", created_at: "2015-04-14 17:22:46.318314", updated_at: "2015-04-14 17:22:46.318314"> *find_by_(フィールド名)_and_(フィールド名) p Post.find_by_title_and_id("second", 9) :> ruby main.rb #<Post id: 9, title: "second", body: "Yeah", created_at: "2015-04-14 17:22:46.318314", updated_at: "2015-04-14 17:22:46.318314"> ###条件から探す(where) p Post.where(title: "second") #find_by_titleより書きやすい、複数抽出できる :> ruby main.rb #<ActiveRecord::Relation [#<Post id: 9, title: "second", body: "Yeah", created_at: "2015-04-14 17:22:46.318314", updated_at: "2015-04-14 17:22:46.318314">, #<Post id: 11, title: "second", body: "Yeah", created_at: "2015-04-14 17:23:12.256308", updated_at: "2015-04-14 17:23:12.256308">, #<Post id: 15, title: "second", body: "Yeah", created_at: "2015-04-14 17:24:09.661676", updated_at: "2015-04-14 17:24:09.661676">]> p Post.where(:title => "title1", :id => 1) p Post.where("title = ? and id = ?", "title1", 1) p Post.where("title = :title and id = :id", {:title => "title1", :id =>1}) #比較演算子(代入以外不可) p Post.where("id > ?", 5) =>? に5を代入、(id > 5)ではエラーが出る #like(代入以外不可) p Post.where("title like ?", "%4")
レコード更新
post = Post.find(1) #更新したいレコードを見つける #post.update_attribute :title, "yes" #1つのフィールドを変更する場合 post.update_attributes title: "ok", body: "keioka"#2つ以上の場合 attributes Post.where(:id => 1..2).update_all(:title => "nnn2", :body => "hhh2")
Railsでは括弧が省略されている事が多い
レコード削除
#main.rb #delete(id_or_array) #delete_all(conditions = nil) #destroy(id) #destroy(condition = nil) #delete(id or array or range) Post.delete(1) Post.delete(1..4) #delete_all Post.delete_all(body: "aaaaa") #destroy(id) Post.destroy(9) #destroy(condition = nil) Post.destroy(id: 18)
Active Record: The Rails Database Bridge - Tuts+ Code Tutorial
検証
#validation ##存在してるか class Post < ActiveRecord::Base validation(:title, :presence => true) end #Error post = Post.new(title: "aaa", body: "validation") post = Post.new(title: "aaa", body: "validation") post.valid? =>false p post.errors[:title] =>["can't be blank"] p post.errors.full_messages =>["Title can't be blank"] p post.errors.messages =>{:title=>["can't be blank"]} #Past post = Post.new(title: "aaa", body: "validation") true p post.errors[:title] =>[ ] p post.errors.full_messages =>[ ] p post.errors.messages =>{:title=>[ ]} ##長さ検証 () class Post < ActiveRecord::Base validation :title, :presence => true validates :body, :length => { :minimum => 5 } end