Scope trong rails
Scope là một câu lệnh truy vấn đặc biệt mà bạn có thể sử dụng nhiều lần mà không cần viết lại. Ví dụ mình muốn lấy các User đã được active, mình sẽ khai báo trong class của Model class User < ApplicationRecord scope :activated , - > { where activated : true } end ...
Scope là một câu lệnh truy vấn đặc biệt mà bạn có thể sử dụng nhiều lần mà không cần viết lại. Ví dụ mình muốn lấy các User đã được active, mình sẽ khai báo trong class của Model
class User < ApplicationRecord scope :activated, -> {where activated: true} end
và khi muốn lấy các Users đã active, ta chỉ cần viết User.activated
Ngoài ra ta có thể truyền kèm tham số vào Scope, ví dụ như
class User < ApplicationRecord scope :name_like, ->(name){where "name LIKE ?", "%#{name}%"} end
Ở đây tham số name được truyền vào để tìm kiếm theo tên, khi muốn gọi đến scope này ta viết User.name_like name
Nếu ta muốn sử dụng scope cho tất cả các câu lệnh query trong model, có thể dùng default_scope
class User < ApplicationRecord default_scope {where activated: true} end
Với câu lệnh này, mỗi khi khởi tạo một record của User, trường activated sẽ được khởi tạo mặc định là true. default_scope chỉ dùng khi create, ko sử dụng được khi update.
Scopt có ưu điểm là có thể dùng nhiều scope một lúc, các điều kiện được nối với nhau bằng AND
class User < ApplicationRecord scope :active, -> { where state: "active" } scope :finished, -> { where state: "finished" } end
Khi gọi tới User.active.finished, câu lệnh query sẽ là
SELECT "user".* FROM "users" WHERE "users"."state" = "active" AND "users"."state" = "finished"
Cũng có thể sử dụng trực tiếp where khi gọi tới scope, cũng cho kết quả tương tự User.active.where(state: "finished")
Nếu ở trong một function nào đó, ta muốn bỏ hết các scope, ta dùng phương thức unscoped. Phương thức này thường được dùng để bỏ qua default_scope.
Nguồn tham khảo http://guides.rubyonrails.org/active_record_querying.html