両者の何がどう違うのか曖昧だったので、忘備録として残します。
findメソッド
主キー(ID)を使用して、特定のオブジェクトを検索する際に使用するメソッド。
↓例えば、Spree::Taxon
モデルの中からid=1
のオブジェクトを検索したい時
find_method_example.rb
pry(main)> test = Spree::Taxon.find(1)
Spree::Taxon Load (0.4ms) SELECT `spree_taxons`.* FROM `spree_taxons` WHERE `spree_taxons`.`id` = 1 LIMIT 1
=> #<Spree::Taxon:0x00007fbaa17a7d68
id: 1,
parent_id: nil,
position: 0,
(中略)
meta_keywords: nil,
depth: 0>
↓同時に複数のレコードを検索をすることも可能です。
find_method_example2.rb
pry(main)> test = Spree::Taxon.find(1,2) もしくは find([1,2])
Spree::Taxon Load (0.4ms) SELECT `spree_taxons`.* FROM `spree_taxons` WHERE `spree_taxons`.`id` IN (1, 2)
=> [#<Spree::Taxon:0x00007fbaa17c6358
id: 1,
parent_id: nil,
(中略)
meta_keywords: nil,
depth: 0>,
#<Spree::Taxon:0x00007fbaa17c6218
id: 2,
parent_id: nil,
(中略)
meta_keywords: nil,
depth: 0>]
↓マッチするレコードが見当たらない場合、例外が発生します。
この例では9999
というid
は存在しないのでActiveRecord::RecordNotFound
が発生します。
find_method_example3.rb
pry(main)> test3 = Spree::Taxon.find(1,2,9999)
Spree::Taxon Load (0.5ms) SELECT `spree_taxons`.* FROM `spree_taxons` WHERE `spree_taxons`.`id` IN (1, 2, 9999)
ActiveRecord::RecordNotFound: Couldn't find all Spree::Taxons with 'id': (1, 2, 9999) (found 2 results, but was looking for 3).
find_byメソッド
検索したい条件に合うレコードから最初に一致した1件だけを拾ってきます。
↓例えば、Spree::Product
モデルの中から、promotionable: true
の条件に当てはまるオブジェクトを探す時。
find_by_method_example.rb
pry(main)> test = Spree::Product.find_by(promotionable: true)
Spree::Product Load (0.4ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`promotionable` = TRUE LIMIT 1
=> #<Spree::Product:0x00007fbaa4008398
id: 1,
name: "Ruby on Rails Tote",
(中略)
promotionable: true,
meta_title: nil>
↓マッチするレコードが見当たらない場合、nilが返ってきます。
find_by_method_example2.rb
pry(main)> test = Spree::Product.find_by(promotionable: false)
Spree::Product Load (0.4ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`promotionable` = FALSE LIMIT 1
=> nil
↓マッチするレコードが見当たらない場合で、例外を発生させたい時はfind_by!
で検索
find_by_method_example3.rb
pry(main)> test = Spree::Product.find_by!(promotionable: false)
Spree::Product Load (0.4ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`promotionable` = FALSE LIMIT 1
ActiveRecord::RecordNotFound: Couldn't find Spree::Product
使用区別
IDがわかっている場合は、find
メソッド
IDが不明で、別の条件でレコード検索をしたい場合は、find_by
メソッド