📅  最后修改于: 2023-12-03 14:50:32.120000             🧑  作者: Mango
参数化范围(parameterized scope)是一个非常方便的 Rails 技巧,它可以让开发者在 ActiveRecord 模型中定义一个指定条件,并在许多字符串查询中重复使用它。
参数化范围看似是一个很小的东西,但实际上它非常强大并且可以轻松地减少你的代码中的重复性。
参数化范围可以通过类方法 scope
来定义。
class Post < ApplicationRecord
scope :published, ->(status) { where(status: status) }
end
上面的示例定义了一个 published
的范围(scope),该范围定义了一个查询 where(status: STATUS)
,其中 STATUS
是通过方法中传入的参数 status
决定的。由于 where
方法的参数使用了哈希语法 (hash syntax),所以此范围的参数是具有键值(key-value)对形式的哈希变量。
当我们想查询已发布的文章时,可以这样使用:
# 查询 status 为 'published' 的文章
Post.published('published')
然后,你就可以在多个查询中重复使用这个范围。
# 查询所有已发布的文章
Post.published('published')
# 统计被赞过的已发布文章
Post.published('published').joins(:likes).count
上述查询语句的每个实例都将采用 status = 'published'
的条件。另外,如果需要指定多个查询条件,可以在范围内同时传入多个参数。
# 在范围内传入多个参数
class Post < ApplicationRecord
scope :filter_by_status, ->(status, user) { where(status: status, user_id: user.id) }
end
# 使用范围 filter_by_status 查询用户发布的已发布文章
Post.filter_by_status('published', current_user)
在上面的示例中,范围 filter_by_status
接受两个参数,一个表示文章状态,一个表示用户。然后我们根据这些参数查询文章,以此过滤结果。
参数化范围是一种通用且方便的方法,它可以帮助你在 ActiveRecord 模型中减少代码的重复性,从而让你的应用更加简洁高效。使用参数化范围,你可以定义一组预定义的查询,以便在多个控制器和视图中使用。在 Rails 中这是一种非常有用的编码技巧,因为它可以帮助你更快的开发应用程序,同时减少你的代码规模。