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

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