📜  参数化范围 rails 代码 (1)

📅  最后修改于: 2023-12-03 14:50:32.120000             🧑  作者: Mango

参数化范围(Rails)

参数化范围(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 中这是一种非常有用的编码技巧,因为它可以帮助你更快的开发应用程序,同时减少你的代码规模。