Flexible Search
Model.search()
メソッドを使うと、オブジェクトベースの柔軟な検索が可能です。
(インターフェースは Ransack gem を参考にしています)
検索パラメータは、フィールド名と検索条件を組み合わせた文字列をキー、検索用の値をバリューとして持つオブジェクトで指定します。
キーには関連付けを含めることができます。
検索条件には、eq
, cont
, matches
, lt
, gte
, in
, null
などが利用可能です。
その他に not
, or
, and
, any
, all
などの修飾子も用意されています。
詳細はsearch()
メソッドのドキュメントを参照してください。
import { User } from "./models/index.js";
const search = User.search({ name_eq: "John", // name が "John" に等しい age_not_null: 1, // age が null でない profile_bio_cont: "foo", // 関連である profile の bio が "foo" を含む email_or_name_cont_any: ["bar", "baz"], // email または name が "bar" または "baz" を含む});const users = search.result();
また、検索パラメータのキーにはsearchableScopes
配列で定義された検索可能なスコープの名前を含めることができます。
例えば以下のように定義されたbio_cont
スコープは検索パラメータで使用することができます。
import { scope } from "accel-record";import { ApplicationRecord } from "./applicationRecord.js";
class UserModel extends ApplicationRecord { @scope static bio_cont(value: string) { return this.joins("profile").where({ profile: { bio: { contains: value } }, }); } static searchableScopes = ["bio_cont"];}
import { User } from "./models/index.js";
const search = User.search({ bio_cont: "foo" }); // profile の bio が "foo" を含むconst users = search.result();