ActiveRecord - Scopes
Los scopes te permiten definir consultas frecuentes como métodos que puedes invocar sobre los modelos o asociaciones.
Para definir un scope utiliza el método scope en la clase del modelo pasando la consulta que quieres que se ejecute cuando utilizan el scope:
1
class Article < ApplicationRecord
2
scope :published, -> { where(published: true) }
3
end
Copied!
Esto es equivalente a utilizar un método de clase:
1
class Article < ApplicationRecord
2
def self.published
3
where(published: true)
4
end
5
end
Copied!
Para utilizar el scope lo invocas sobre la clase Article o sobre alguna asociación:
1
published_articles = Article.published
2
3
# asumiendo que existe un modelo User que tiene una asociación a Article
4
user = User.first
5
published_articles = user.articles.published
Copied!
Los scopes se pueden encadenar. Por ejemplo, si tenemos dos scopes en nuestra clase Article:
1
class Article < ApplicationRecord
2
scope :published, -> { where(published: true) }
3
scope :popular, -> { where('views > ?', 10) }
4
end
Copied!
Los puedes encadenar de la siguiente forma:
1
articles = Article.published.popular
Copied!

Argumentos

Los scopes pueden recibir argumentos.
Por ejemplo:
1
class Article < ApplicationRecord
2
scope :created_before, -> (time) { where("created_at < ?", time) }
3
end
Copied!
Un scope con argumentos se invoca como si fuera un método de clase:
1
Article.created_before(Time.zone.now)
Copied!
Recuerda que el scope se puede escribir también como un método de clase:
1
class Article < ApplicationRecord
2
def self.created_before(time)
3
where("created_at < ?", time)
4
end
5
end
Copied!
Last modified 3yr ago
Copy link
Contents
Argumentos