現状:
エンジニアへの未経験転職。
就職先も決まり、2月からひよこエンジニアに。
2025年は頑張ろうということで、2025年学習記録15日目。
内容は常に書き散らしのメモです、あしからず。
当面の目標:LPIC101,102合格
Ruby on Rails
scope
メソッド
Rails特有の機能で、Active Recordモデルで使用される機能。
よく使用されるクエリを名前付きメソッドとしてモデルに定義する。
これにより、複雑なデータベースクエリを簡潔に表現し、再利用可能にする。
特徴
- 再利用性: 共通のクエリ条件を一箇所で定義し、複数の場所で使用できます[3]。
- チェーン可能: 他のクエリメソッドやscopeと組み合わせて使用できます[2]。
- 可読性の向上: 複雑なクエリに意味のある名前を付けることで、コードの意図が明確になります[1][3]。
- ActiveRecord::Relationの返却: scopeは常にActiveRecord::Relationオブジェクトを返すため、さらなるクエリメソッドを連鎖させることができます[1]。
基本的な構文
class モデル名 < ApplicationRecord
scope :スコープ名, -> { クエリ条件 }
end
使用例
class Post < ApplicationRecord
scope :published, -> { where(published: true) }
scope :recent, -> { order(created_at: :desc) }
scope :created_after, ->(date) { where("created_at > ?", date) }
end
# 使用方法
Post.published
Post.recent
Post.created_after(1.week.ago)
この例では、published
、recent
、created_after
という3つのscopeを定義しています[3][5]。
scopeを使用することで、コードの重複を避け、クエリをより直感的に表現できます。また、条件の変更が必要な場合も、scopeの定義を変更するだけで済むため、保守性も向上します[3][5]。
Citations:
[1] https://qiita.com/ozin/items/24d1b220a002004a6351
[2] https://qiita.com/yuukinakamura0925/items/c7a9b80fce2f0285dd32
[3] https://01memo.com/rails/scope/
[4] https://qiita.com/shimada_slj/items/7991c869708d43b36e3c
[5] https://zenn.dev/yusuke_docha/articles/ca0637ccc8d01f
[6] https://zenn.dev/airiswim/articles/faaf11cb8197a3
[7] https://pikawaka.com/rails/scope
[8] https://engineering.mobalab.net/2020/06/01/rails-has-many-through-with-scope/
Active Record
Ruby on Railsフレームワークで使用されるデータベース抽象化層およびORMシステム。
定義と役割
- MVCアーキテクチャのModelコンポーネントを担当します[1][4]。
- データベースとアプリケーションのオブジェクト間のマッピングを提供します[1]。
主要機能
- オブジェクト-リレーショナルマッピング(ORM): データベーステーブルとRubyオブジェクトを対応付けます[2]。
- CRUD操作: Create(作成)、Read(読み取り)、Update(更新)、Delete(削除)の基本的なデータベース操作を簡単に行えます[3][4]。
- バリデーション: データの妥当性を確認するルールをモデルに定義できます[1]。
- 関連付け: 異なるモデル間の関係(例:ユーザーと投稿)を定義できます[1]。
- クエリインターフェース: SQLを直接書かずに、Rubyのメソッドチェーンでデータベースクエリを構築できます[1]。
- コールバック: データベース操作の前後に特定の処理を実行できます[1]。
- トランザクションサポート: データの一貫性を保つための複数の操作をまとめて実行できます[1]。
利点
- データベース操作を抽象化し、開発者がSQLを直接書く必要性を減らします[2]。
- オブジェクト指向プログラミングの原則に従ってデータベースとやり取りできます[1]。
- データベース設計とRubyコードの間の一貫性を維持しやすくなります[3]。
Citations:
[1] https://zenn.dev/sudoukky/articles/8075ed82eca1f9
[2] https://qiita.com/shizen-shin/items/d3c3a41ff9b46ebd1436
[3] https://railsguides.jp/v5.2/active_record_basics.html
[4] https://railsguides.jp/active_record_basics.html
[5] https://qiita.com/ryokky59/items/a1d0b4e86bacbd7ef6e8
[6] https://zenn.dev/ganmo3/articles/3d2a724e9e49ef
[7] https://blog.fundely.co.jp/tech/2023/05/10/activerecordに関する様々な知見/
[8] https://www.techpit.jp/courses/61/curriculums/65/sections/527/parts/1827
同様の思想を用いた他言語、フレームワークでのORM
-
Eloquent
:Laravel
で使用されるORM。Eloquent
はActive Recordパターンを採用しており、Railsの Active Recordと多くの共通点があります[2]。 -
Django
:PythonのDjangoでは独自のORMが提供されており、Active Recordパターンに似た機能を持っています。 -
Hibernate
:Java の世界では、Hibernate
などのフレームワークが同様の機能を提供しています。
これらのORMは、データベース操作の抽象化、オブジェクトとデータベースレコードのマッピング、クエリビルダーの提供など、Active Recordの主要な特徴を共有しています[1][3]。
ただし、実装の詳細や具体的な使用方法は、各言語やフレームワークによって異なります。例えば、クエリの記述方法やリレーションの定義方法などに違いがあります[2]。
結論として、Active Recordの思想自体は広く採用されていますが、Railsの実装が特に有名で、他のフレームワークのORMに影響を与えています。
Citations:
[1] https://zenn.dev/sudoukky/articles/8075ed82eca1f9
[2] https://qiita.com/chdkm/items/bcb11450e34e569597ac
[3] https://zenn.dev/syommy_program/articles/63107f427156d8
[4] https://zenn.dev/hiromichinomata/articles/553eaf94b71f95
[5] https://qiita.com/nakad119/items/35dfe655558dce0db582
[6] https://logmi.jp/main/technology/326565
[7] https://railsguides.jp/active_record_basics.html
[8] https://zenn.dev/mizchi/articles/d33a4174cca886
Ruby
累乗(べき乗)の計算方法
算術演算子 **
result = 2 ** 3 # 2の3乗を計算
puts result # 出力: 8
pow
メソッド
result = 2.pow(3) # 2の3乗を計算
puts result # 出力: 8
pow メソッドは Integer クラスで定義されており、** 演算子と同じ結果を返す。
小数や負の数
puts 2.5 ** 2 # 出力: 6.25
puts (-3) ** 2 # 出力: 9
puts 2 ** (-2) # 出力: 0.25 (Float型)
パフォーマンスが重要な場合や、非常に大きな数を扱う場合は、より効率的なアルゴリズムを使用することも可能。
Linux
リングバッファ
データを一時的に保存するための循環型のデータ構造。
特徴
- 固定サイズ: 初期化時に定義された一定のサイズを持ちます[2]。
- 循環的なアクセス: データはバッファの末尾に追加され、先頭から取り出されます。バッファが満杯になると、新しいデータが最も古いデータを上書きします[1][2]。
- 論理的な連結: バッファの終端と先端が論理的に連結されており、循環的に利用されます[1][3]。
- 効率的なデータ管理: ストリーミングデータやシリアル通信データなどの連続的なデータストリームの処理に適しています[2]。
- 高速なアクセス: 配列リストと同様に、高速なランダムアクセス(オーダーO(1))が可能です[4]。
リングバッファは、常に一定数の過去データを保持しながら、最新のデータで古いデータを上書きする用途に適しています[1][3]。この構造により、メモリの再割り当てを必要とせず、データの追加と削除を効率的に行うことができます[2]。
Citations:
[1] https://ja.wikipedia.org/wiki/リングバッファ
[2] https://note.com/tedd_jp/n/ne4b97ce378a1
[3] https://www.weblio.jp/content/リングバッファ
[4] https://ufcpp.net/study/algorithm/col_circular.html
[5] https://wa3.i-3-i.info/word14292.html
[6] https://wa3.i-3-i.info/diff1125etc.html
[7] https://tomokilab.com/what-is-ring-buffer/
[8] https://future-architect.github.io/articles/20210705a/