ruby-on-rails - 是否可以指定链式范围查询的顺序
问题描述
我目前正在做这样的链式范围查询
Enrollment.active.occurs_today
是否可以对查询进行排序,以便在.active
之前查询.occurs_today
并防止延迟加载?希望类似于下面的东西
Enrollment.active.eval.occurs_today
解决方案
并不总是赞赏的是,链式作用域的顺序并不重要。链式作用域正在构建包含所有条件的单个查询,然后当您执行查询(例如,通过请求记录或计数)时,将使用组合条件检索记录。
例外是 rails 控制台,每个作用域在输入时都会在其中执行。
如果您有伪范围(执行返回id
然后查询的查询),您可以将其实现为类方法并安排将其他范围作为参数传递给类方法以首先执行它们。一个可能的实现可能是......
def self.occurs_today(*scopes)
result = scopes.inject(all) {|relation, scope| relation.send(scope)}
where(id: result.select { |s| s.occurs_on?(Date.current) }.map(&:id))
end
然后你可以做
Enrollment.occurs_today(:active)
或几个范围
Enrollment.occurs_today(:active, :priority)
在这两种情况下,select
都将在已经作用域的关系上执行。
或者,我认为您可以通过更改现有occurs_today
范围来看到性能的改进(以及范围顺序的自动识别)。
而不是选择所有记录...
scope :occurs_today, -> { where(id: all.select { |s| s.occurs_on?(Date.current) }.pluck(:id) }
...仅选择当前范围的记录...
scope :occurs_today, -> { where(id: select { |s| s.occurs_on?(Date.current) }.pluck(:id) }
推荐阅读
- swift - Swift 5:不推荐使用 String.UTF16View.Index(encodedOffset: l)
- android - GraphHopper 错误:在版本 1 中使用了编码器汽车,但当前版本是 2
- c++ - 如何以这种方式对齐 qtreewidget 列中的文本:“...qtreewidgetitemdata”而不是“qtreewidgetitemdata ...”?
- java - 如何使用通知栏上的服务控制媒体播放器
- python - 解析列表以获取确切值
- xml - 使用 Yoast 插件未在站点地图 xml 上显示类别 slug
- c# - 无法将下拉菜单的选项设置为 api 以 json 格式返回的字段
- javascript - ESLint Javascript:尝试关闭引号规则但关闭似乎被忽略
- react-native - 如何在 React Native 上的图像上设置阴影
- javascript - 为 iPad 实现下载 servlet