検索結果を全削除
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になければ追加する
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を指定して実行した