rails ActiveRecord 基本

本稿について

本稿はサイト運営者が学んだことなどを記したメモの内容です。
全てが正確な情報とは限りません。ご注意ください。また修正するべき点は適時修正していきます
検索結果を全削除
self.contents.where(contents_type: 'Movie', contents_id: [1,2,3]).destroy_all

[参考]


複数のデータを更新する
User.where(id: [1,2,3]).update_all(status: 'remove')




OR検索
User.where("(id = ?) OR (id = ?)", 11, 12)

Point.where(receive_user_id: user.id).or(Point.where(paid_user_id: user.id))
※ includesをする場合には両方に設定しないといけない


BETWEENで 以上/以下

.where(num: Float::INFINITY..30 ) # 30以下
.where(num: 30..Float::INFINITY ) # 30以上

日付の場合
# xx日以上
.where(created_at: Time.zone.parse("2020-01-01 00:00:00")..Time.zone.now)

# xx日以下
.where(created_at: Time.zone.now..Float::INFINITY)



特定の日を検索
Model.exists?(created_at: Date.new(2019,5,23).all_day)



NOT検索
Model.where.not(entry_id: nil)


DBになければ追加する
find_or_create_by!



Orderをアソシエーション先を利用してorderする
AlbumContent.includes(:content).where(album_id: album.id).order("contents.published_at DESC")




特定のカラムをインクリメントする
Model.increment!(:view_count) # view_countの値をインクリメントする



接続先のデータベースを確認する
Model.connection.current_database


json形式の検索

単数
Model.where("JSON_CONTAINS(options, '\"run\"', '$.purpose')")

複数
Program.where("JSON_CONTAINS(options, '[\"run\",\"physical\"]', '$.purpose')")



SQLの実行

方法はいくつかあるが、 find_by_sqlを使うことが多い。
query = "SELECT data FROM Hoge WHERE str = BINARY ? LIMIT 1"
route = Model.find_by_sql([query, params[:str]])

※ MySQLでは BINARY属性を指定しないと大文字、小文字を一緒に検索してしまうので、上記のようにSQLを指定して実行した
Back