[#<User id: 5, name: "Dave", email: "example@gmail.com", info: {"years_old"=>"30", "recent_purchases"=>["car", "house", "boat"]}>] Supongamos que estoy guardando compras recientes en {info: { recent_purchases: []) en el modelo de usuario
Quiero hacer un alcance para obtener usuarios con solo 'car' en compras recientes. No puedo cambiar la estructura de la base de datos, así que tengo que resolverlo.
Probé este User.where("info->>'recent_purchases' IN (?)", 'car') pero no funciona
Esto tampoco funcionó - User.where("info->>'recent_purchases' = ?", ["car"])
Editar: ¡Gracias a @Jacob, esto funcionó perfectamente!
User.where("where info -> 'recent_purchases' ? :car and jsonb_array_length(info -> 'recent_purchases') = 1", car: 'car') Edit2:
Si desea crear un alcance para un usuario que tiene un automóvil en sus compras recientes, así es como lo hace:
scope :where_cars_included, -> { where("info::jsonb -> 'recent_purchases' ? :purchase", purchase: 'car') }Para alcance SOLO con autos en compras_recientes:
scope :only_cars, -> { where("info::jsonb -> 'recent_purchases' ? :purchase and json_array_length(info -> 'recent_purchases') = 1", purchase: 'car') }Hay una pequeña guía que puede ayudar:
Obtenga usuarios con un automóvil en compras_recientes
User.where("info -> 'recent_purchases' ? :car", car: car)Obtenga usuarios con solo un automóvil en compras_recientes
User.where("info -> 'recent_purchases' = to_jsonb(array[:car])", car: car)una alternativa al ejemplo anterior
User.where("info -> 'recent_purchases' ? :car and jsonb_array_length(info -> 'recent_purchases') = 1", car: car)Si la información es json en lugar de jsonb, transmítala a jsonb
info::jsonbConsulte la documentación de PostgreSQL para conocer más formas de consultar contra json/jsonb: