ActiveRecord
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
&tag(ActiveRecord);
*目次 [#t9585ef4]
#contents
*参考情報 [#xd595ebe]
-[[読書メモ+tips+日記:[Ruby] ActiveRecord を単体で(Rail...
-[[ActiveRecord を 単独で使う例: katoy: cocolog:http://yo...
-[[Active Record クエリインターフェイス | Rails ガイド:ht...
*スコープ [#m621287a]
-おおむねstaticメソッドだがnilを返すとallとなるところが異...
*検索 [#pba5c11a]
**概要 [#wec34d52]
-[[Rails 4で非推奨になった/なっていないfinderメソッドを整...
-[[rails/activerecord-deprecated_finders:https://github.c...
-dynamic finderが全て非推奨になったわけではない(find_by_n...
**IDや項目で検索 [#wd1c188e]
-findを使う。レコードが存在しない場合例外発生
book = Book.find(999)
-find_by_idを使う。レコードが存在しない場合nil。
book = Book.find_by_id(999)
book = Book.find_by_name('おもしろい本')
book = Book.find_by_name!('おもしろい本') #=>例外発生た...
-find_by(ハッシュ)を使う。レコードが存在しない場合nil
book = Book.find_by(id: 999)
book = Book.find_by(name: 'おもしろい本')
book = Book.find_by!(name: 'おもしろい本') #=>例外発生さ...
book = Book.find_by(name: 'おもしろい本', price: 100) #=...
**whereで条件指定 [#x0fdb833]
-[[Active Record クエリインターフェイス | Rails ガイド:ht...
-whereで指定できる条件には、文字列、配列、ハッシュなど。
-Are系は存在しない場合空配列となる。firstで先頭要素を取得...
book = Book.where("title=?", title).first
-文字列で検索したい場合
books = Book.where("title='abc'")
-配列で検索。"?"でプレースホルダを指定できる。
books = Book.where("title=? AND price=?" title, price)
-ハッシュで指定。キーにフィールド、ハッシュ値にその値。複...
books = Book.where(title: 'abc')
books = Book.where('title' => 'abc')
books = Book.where(title: 'abc', author: 'def')
**関連オブジェクトを使って検索 [#k3f0338f]
-includesやjoinsを使って検索できる。[[includes (ActiveRec...
-例えば以下の通り
#pre{{
users = User.includes(:address)
users.each do |user|
user.address.city
end
User.includes(:posts).where('posts.name = ?', 'example')....
}}
-ここでincludesに指定するのは関連の名前(belongs_toやhas_m...
-referencesはテーブル参照が必要なことを明示している。これ...
**並び替え [#j4148b2b]
-orderを使って並び替えることができる
Book.order(:created_at)
-ASC、DESCの指定(全てのレコードを対象とする場合.all.order...
Book.order(created_at: :desc)
Book.order(created_at: :asc)
Book.order("created at DESC")
Book.order("title DESC, created_at ASC")
**個数制限 [#b70bbf84]
-limitを使う
Book.order(:created_at).limit(10)
*更新 [#we2b3043]
**条件にあうものをまとめて更新する。 [#e914b7f9]
-whereしてからupdateではなく、whereしてからupdate_allする...
User.where(age:25).update_all(hobby:'game')
**updateとupdate_attributesの違いって? [#r080226f]
-[[ActiveRecord の attribute 更新方法まとめ - Qiita:https...
**オブジェクトの属性をコピーしたい [#q75db21c]
-[[ruby - Creating a new object from another object's att...
-updateとattributesを使ってこうする?
obj1.update(obj2.attributes.except('id', 'created_at', '...
*保存 [#d162a6c4]
**保存時に検証処理をバイパスする [#yb717c8a]
-saveメソッドに"validate: false"を指定する。
@product.save(validate: false)
*削除 [#ibe258c8]
**全削除系 [#e98e0319]
***delete_allとdestroy_allの違い [#xa80c52a]
-delete_allは関連を削除せずActiveRecordを介さないので高速。
-destroy_allは関連を削除するためにActiveRecordを介するの...
***パラメータの指定 [#a8368bf7]
-whereで検索してからdelete_all or destroy_allすればよい
Manager.where(:manager_level => 5).destroy_all
*Tips [#za8f7a18]
**保存済みレコードかどうかの確認 [#a1b055eb]
-new_record? 新規データの場合はtrue。
item.new_record?
-persisted?保存済みの場合はtrue。
item.persisted?
**複数のデータベースに接続する [#jdc8bc0c]
-ActiveRecord::Baseを継承したクラスでestablish_connection...
#pre{{
class OldPerson < ActiveRecord::Base
self.table_name = 'person'
self.inheritance_column = :old_type
self.establish_connection(:adapter=>"mysql2",:host=>"lo...
base=>$olddbname)
end
class Person < ActiveRecord::Base
self.inheritance_column = :old_type
self.establish_connection(:adapter=>"mysql2",:host=>"lo...
base=>$newdbname)
end
}}
**type列がエラーになる [#k2b54f44]
-self.inheritance_column = :old_typeのようにして回避する
#pre{{
class OldPerson < ActiveRecord::Base
self.table_name = 'person'
self.inheritance_column = :old_type
end
}}
**大量のINSERTを早くする [#j333ff18]
***バックエンドのDB設定をチューニングする [#efef9ed0]
-MySQLの場合my.cnfでinnodb_buffer_pool_sizeなどをいじる。
#pre{{
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
}}
***transactionを使う [#ub5ccc1e]
-saveなどをActiveRecord::Base.transaction do endで囲むとC...
***activerecord-import [#bd26a5c1]
-[[zdennis/activerecord-import · GitHub:https://gith...
**SQLを表示する [#x2a1fe33]
-loggerを使う。
#pre{{
require 'logger'
ActiveRecord::Base.logger = Logger.new(STDOUT)
}}
*トラブルシューティング [#i49c62fd]
**モデルクラスに実装したメソッド内でアトリビュートにアク...
-[[ruby on rails - Setting attribute from model without u...
#pre{{
class Device < ActiveRecord::Base
def prepare
full_name = (!show_version || version.nil?)? name : n...
end
end
}}
-上の場合full_nameはローカル変数とみなされて、Deviceのful...
#pre{{
class Device < ActiveRecord::Base
def prepare
self.full_name = (!show_version || version.nil?)? nam...
end
end
}}
-setterの場合は最初からローカル変数とみなされそこで終了す...
-結論。setterにはselfが必要。getterには不要。
** 「[deprecated] I18n.enforce_available_locales will def...
-RailsではなくActiveRecord単体で使った時に表示されるよう...
I18n.enforce_available_locales = false
終了行:
&tag(ActiveRecord);
*目次 [#t9585ef4]
#contents
*参考情報 [#xd595ebe]
-[[読書メモ+tips+日記:[Ruby] ActiveRecord を単体で(Rail...
-[[ActiveRecord を 単独で使う例: katoy: cocolog:http://yo...
-[[Active Record クエリインターフェイス | Rails ガイド:ht...
*スコープ [#m621287a]
-おおむねstaticメソッドだがnilを返すとallとなるところが異...
*検索 [#pba5c11a]
**概要 [#wec34d52]
-[[Rails 4で非推奨になった/なっていないfinderメソッドを整...
-[[rails/activerecord-deprecated_finders:https://github.c...
-dynamic finderが全て非推奨になったわけではない(find_by_n...
**IDや項目で検索 [#wd1c188e]
-findを使う。レコードが存在しない場合例外発生
book = Book.find(999)
-find_by_idを使う。レコードが存在しない場合nil。
book = Book.find_by_id(999)
book = Book.find_by_name('おもしろい本')
book = Book.find_by_name!('おもしろい本') #=>例外発生た...
-find_by(ハッシュ)を使う。レコードが存在しない場合nil
book = Book.find_by(id: 999)
book = Book.find_by(name: 'おもしろい本')
book = Book.find_by!(name: 'おもしろい本') #=>例外発生さ...
book = Book.find_by(name: 'おもしろい本', price: 100) #=...
**whereで条件指定 [#x0fdb833]
-[[Active Record クエリインターフェイス | Rails ガイド:ht...
-whereで指定できる条件には、文字列、配列、ハッシュなど。
-Are系は存在しない場合空配列となる。firstで先頭要素を取得...
book = Book.where("title=?", title).first
-文字列で検索したい場合
books = Book.where("title='abc'")
-配列で検索。"?"でプレースホルダを指定できる。
books = Book.where("title=? AND price=?" title, price)
-ハッシュで指定。キーにフィールド、ハッシュ値にその値。複...
books = Book.where(title: 'abc')
books = Book.where('title' => 'abc')
books = Book.where(title: 'abc', author: 'def')
**関連オブジェクトを使って検索 [#k3f0338f]
-includesやjoinsを使って検索できる。[[includes (ActiveRec...
-例えば以下の通り
#pre{{
users = User.includes(:address)
users.each do |user|
user.address.city
end
User.includes(:posts).where('posts.name = ?', 'example')....
}}
-ここでincludesに指定するのは関連の名前(belongs_toやhas_m...
-referencesはテーブル参照が必要なことを明示している。これ...
**並び替え [#j4148b2b]
-orderを使って並び替えることができる
Book.order(:created_at)
-ASC、DESCの指定(全てのレコードを対象とする場合.all.order...
Book.order(created_at: :desc)
Book.order(created_at: :asc)
Book.order("created at DESC")
Book.order("title DESC, created_at ASC")
**個数制限 [#b70bbf84]
-limitを使う
Book.order(:created_at).limit(10)
*更新 [#we2b3043]
**条件にあうものをまとめて更新する。 [#e914b7f9]
-whereしてからupdateではなく、whereしてからupdate_allする...
User.where(age:25).update_all(hobby:'game')
**updateとupdate_attributesの違いって? [#r080226f]
-[[ActiveRecord の attribute 更新方法まとめ - Qiita:https...
**オブジェクトの属性をコピーしたい [#q75db21c]
-[[ruby - Creating a new object from another object's att...
-updateとattributesを使ってこうする?
obj1.update(obj2.attributes.except('id', 'created_at', '...
*保存 [#d162a6c4]
**保存時に検証処理をバイパスする [#yb717c8a]
-saveメソッドに"validate: false"を指定する。
@product.save(validate: false)
*削除 [#ibe258c8]
**全削除系 [#e98e0319]
***delete_allとdestroy_allの違い [#xa80c52a]
-delete_allは関連を削除せずActiveRecordを介さないので高速。
-destroy_allは関連を削除するためにActiveRecordを介するの...
***パラメータの指定 [#a8368bf7]
-whereで検索してからdelete_all or destroy_allすればよい
Manager.where(:manager_level => 5).destroy_all
*Tips [#za8f7a18]
**保存済みレコードかどうかの確認 [#a1b055eb]
-new_record? 新規データの場合はtrue。
item.new_record?
-persisted?保存済みの場合はtrue。
item.persisted?
**複数のデータベースに接続する [#jdc8bc0c]
-ActiveRecord::Baseを継承したクラスでestablish_connection...
#pre{{
class OldPerson < ActiveRecord::Base
self.table_name = 'person'
self.inheritance_column = :old_type
self.establish_connection(:adapter=>"mysql2",:host=>"lo...
base=>$olddbname)
end
class Person < ActiveRecord::Base
self.inheritance_column = :old_type
self.establish_connection(:adapter=>"mysql2",:host=>"lo...
base=>$newdbname)
end
}}
**type列がエラーになる [#k2b54f44]
-self.inheritance_column = :old_typeのようにして回避する
#pre{{
class OldPerson < ActiveRecord::Base
self.table_name = 'person'
self.inheritance_column = :old_type
end
}}
**大量のINSERTを早くする [#j333ff18]
***バックエンドのDB設定をチューニングする [#efef9ed0]
-MySQLの場合my.cnfでinnodb_buffer_pool_sizeなどをいじる。
#pre{{
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
}}
***transactionを使う [#ub5ccc1e]
-saveなどをActiveRecord::Base.transaction do endで囲むとC...
***activerecord-import [#bd26a5c1]
-[[zdennis/activerecord-import · GitHub:https://gith...
**SQLを表示する [#x2a1fe33]
-loggerを使う。
#pre{{
require 'logger'
ActiveRecord::Base.logger = Logger.new(STDOUT)
}}
*トラブルシューティング [#i49c62fd]
**モデルクラスに実装したメソッド内でアトリビュートにアク...
-[[ruby on rails - Setting attribute from model without u...
#pre{{
class Device < ActiveRecord::Base
def prepare
full_name = (!show_version || version.nil?)? name : n...
end
end
}}
-上の場合full_nameはローカル変数とみなされて、Deviceのful...
#pre{{
class Device < ActiveRecord::Base
def prepare
self.full_name = (!show_version || version.nil?)? nam...
end
end
}}
-setterの場合は最初からローカル変数とみなされそこで終了す...
-結論。setterにはselfが必要。getterには不要。
** 「[deprecated] I18n.enforce_available_locales will def...
-RailsではなくActiveRecord単体で使った時に表示されるよう...
I18n.enforce_available_locales = false
ページ名: