ruby-on-rails - rails : call method within model

标签 ruby-on-rails ruby model

这个我想不通。 在 Rails 模型中,我想在同一模型中调用一个方法来操作 find 方法返回的数据。这个“过滤器”方法将从这个模型中的许多自定义查找方法中调用,所以我希望它是分开的。 (而且我无法从 SQL 中过滤它太复杂了)

这是一个例子:

#controller
@data = Model.find_current

#model
class Model
  def self.find_current
    @rows = find(:all)
    filter_my_rows
    return @rows
  end

  def filter_my_rows
    #do stuff here on @rows
    for row in @rows
      #basically I remove rows that do not meet certain conditions
    end
  end
end

结果是:未定义的方法 `filter_my_rows'

感谢您的帮助!

最佳答案

部分问题在于您正在定义一个名为 find_current 的类方法和一个名为 filter_my_rows 的实例方法。通常,您将它们都定义在同一范围内,以便它们一起工作。

另一件事是,您可以通过简单的 Array#reject 调用来完成所需的大量过滤。例如:

@models = all.reject do |m|
   # This block is used to remove entries that do not qualify
   # by having this evaluate to true.
   !m.current
end

您也可以通过根据需要插入函数来将其模块化,但如果您不小心的话,管理起来可能会非常复杂。

# Define reusable blocks that are organized into a Hash
CONDITION_FILTERS = {
  :current => lambda { |m| m.current }
}

# Array#select is the inverse of Array#reject
@models = all.select(CONDITION_FILTERS[:current])

虽然您在问题中声明这只是因为担心在从数据库中加载所有记录之前无法确定特定记录的相关性,但这通常是错误的形式,因为您可能会拒绝您经历了检索和实例化为模型的麻烦的大量数据只是为了立即丢弃它们。

如果可能,您至少应该在请求期间缓存检索到的行,这样您就不必一遍又一遍地获取它们。

关于ruby-on-rails - rails : call method within model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1143405/

相关文章:

mysql - 仅列出与 Rails 3 中的用户相关的问题

css - wkhtmltopdf 文本分为 2 页

ruby - 如何 Swagger 传递多值查询参数

ruby-on-rails - 是否有可能在多个内核中运行单个 Sidekiq 进程?

model - 自动建模 3D 人体的最佳方法

ruby-on-rails - rails模型的条件类继承

ruby-on-rails - ruby 使用 open-URI 从 S3 读取文件

ruby-on-rails - Capistrano 部署、 Assets 管道、未找到 ruby​​-debug

ruby-on-rails - 在散列中找到低于前一个数字的第一个键/值的最快方法

javascript - 如何在 SAPUI5 上检索字段值