LoginSignup
3
1

More than 3 years have passed since last update.

find, find_by, find_by_sqlメソッドの違いについて

Posted at

railsの学習を進めていく上で似たようなメソッドが出てきたのでまとめたいと思います。

findメソッドとは

指定したモデルのidを引数に設定することでレコードを取得するメソッドです。

例えば↓↓↓

pry(main)> Tweet.find(1)
   (0.4ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  Tweet Load (0.3ms)  SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 1 LIMIT 1
=> #<Tweet:0x00007fa3fd3800d8
 id: 1,
 text: "aaaaa",
 image: "",
 created_at: Mon, 13 Jul 2020 06:42:56 UTC +00:00,
 updated_at: Mon, 13 Jul 2020 06:42:56 UTC +00:00,
 user_id: 1>

id1のレコードを取得出来たことが分かりますね。

find_byメソッドとは

指定したモデルのid以外の条件でも取得することができるメソッドです。(もちろんidでも検索取得可能)

例えば上で記述のレコード内容を見てみるとtextカラムには"aaaaa"という値が入ってますね。これを取得したいと思います。

pry(main)> Tweet.find_by(text: "aaaaa")
  Tweet Load (0.4ms)  SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`text` = 'dv sdvdfsv' LIMIT 1
=> #<Tweet:0x00007fa3db12bd90
 id: 1,
 text: "aaaaa",
 image: "",
 created_at: Mon, 13 Jul 2020 06:42:56 UTC +00:00,
 updated_at: Mon, 13 Jul 2020 06:42:56 UTC +00:00,
 user_id: 1>

引数にtextカラムを指定して値"aaaaa"が入っているレコードを検索取得してますね。

find_by_sqlメソッドとは

SQL文を使用し、データを検索し取得する際に使用するメソッドです。id1のレコードを取得した時


SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 1

というselect文が発行されていました。
今回はこの文を変数に代入してレコードを取得してみようと思います。

pry(main)> query = "SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 1"
=> "SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 1"
[9] pry(main)> Tweet.find_by_sql(query)
  Tweet Load (0.3ms)  SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 1
=> [#<Tweet:0x00007fa3bc0e36e0
  id: 1,
  text: "aaaaa",
  image: "",
  created_at: Mon, 13 Jul 2020 06:42:56 UTC +00:00,
  updated_at: Mon, 13 Jul 2020 06:42:56 UTC +00:00,
  user_id: 1>]

取得できていますね!!

正直find_by_sqlって使うときのイメージが湧かないんですが今後使うことはあるのだろうか。。。。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1