社会不適合破壊的お味噌マン

くまのプーさんのような大人になりたいです!

ActiveRecord

ActiveRecordRuby 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