Rails:模型中的调用方法

时间:2009-07-17 13:50:37

标签: ruby-on-rails ruby model

无法想出这个。 在rails模型中,我想调用同一模型中的方法来操作find方法返回的数据。这个'filter'方法将从这个模型中的许多自定义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'

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

部分问题是你要定义一个名为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])

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

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

答案 1 :(得分:3)

实例的类和函数的功能是你的问题。

你不能以这种方式调用类函数中的实例函数。

使用self.filter_my_rows定义您的功能(请注意self),一切都会正确。

答案 2 :(得分:2)

使用named_scope代替

named_scope :current, :conditions => {:active => true} # this is normal find criteria

然后在您的控制器中

@date = Model.current

你也可以制作named_scopes lambda函数

答案 3 :(得分:0)

您的解决方案有什么问题?你在找什么? 如果我理解你的观点,你实施的主要问题是

  

将调用此“过滤器”方法   从许多自定义查找方法   这个模型,所以我想要它   分开。

...你不能使用named_scopes或with_scope,我想到的第一个解决方案就是创建一个自定义包装器来充当过滤器。

class Model
  def self.find_current
    filtered do
      all
    end
  end

  def self.other_method
    filtered do
      all :conditions => { :foo => "bar" }
    end
  end

  def self.filtered(&block)
    records = yield
    # do something with records
    records
  end

end