这是一个棘手的问题,因为您只有两个非常丑陋的选择,一个有点笨拙:
a)加载所有内容并将其过滤到内存中(不要那样做!)
b) 将方法中的逻辑current_status转换为 SQL 查询,并在current_status方法和search_for_current_status方法中复制逻辑。
c) 复制数据(意思是,当 current_status 更改时,您在 Docket 上设置一个标志,然后您可以使用where.
永远不要做 a - 如果 current_status 方法很简单,请考虑 b(你可以像这样在 Docket 模型的范围方法中定义它)
class Docket < ActiveRecord::Base
def self.open
# so some magic here with joins on the statuses table
end
end
c 基本上只是出于查询目的对数据进行非规范化。您可以将其放入原始模型中,或者您可以创建一个特殊表(您甚至可以通过 cron-job 或其他触发器自动刷新该表 - 可能是Status模型中的 ActiveRecord after_save 回调)