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って使うときのイメージが湧かないんですが今後使うことはあるのだろうか。。。。