我可以访问集合,在rails上的ruby中调用实例方法

时间:2011-01-18 14:27:07

标签: ruby-on-rails ruby reflection activerecord

我正在使用ruby on rails应用程序中的搜索表单。一般的想法是使用form_tag将搜索字段(通过params)提交到我正在尝试搜索的类的模型中的搜索功能。如果函数的名称出现在params中,搜索函数将遍历每个参数并执行作用域函数。

问题在于,当我在这样的集合上调用搜索时:

@calendar.reservations.search({:search_email => "test"})

我不知道如何从搜索功能中引用@ calendar.reservations的集合。

此外,我对@ calendar.reservations.search(...)的工作原理感到困惑,但Reservations.all.search给出了一个错误,说明你不能在数组上调用实例方法。

我已经在这里获得了搜索方法的详细信息:https://gist.github.com/783964

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

据我所知,你根本不需要search方法。

只需使用where

@calendar.reservations.where(:search_email => 'test')

答案 1 :(得分:1)

  

我不知道如何参考   @ calendar.reservations的集合   来自搜索功能。

如果在classmethod中使用self(或Reservation,它是同一个对象),您将访问具有当前范围的记录,因此在您的情况下,您将只看到a的预留特定的日历。

[编辑]我看了你搜索功能,我觉得你想要的是:

def self.search(search_fields)  
  search_fields.inject(self) do |scope, (key, value)|
    scope.send(key, value)
  end
end
  

此外,我很困惑为什么   @ calendar.reservations.search(...)   有效,但Reservations.all.search   给我一个错误,说你做不到   在数组上调用实例方法。

@calendar.reservations不返回标准数组,而是返回(懒惰)AssociationCollection,您仍然可以应用范围(以及类方法作为filter)。另一方面,Reservation.all返回一个普通数组,因此你不能在那里执行search(或任何范围)。

答案 2 :(得分:1)

我强烈建议你看看Ernie Miller的MetaSearch创业板。它可以非常优雅地处理您正在处理的事情,并且非常容易实现。我怀疑您的视图代码几乎可以完成GEM所需的内容,这将非常好地满足您所有的模型搜索需求。

看看它是否能解决您的问题。祝你好运!

答案 3 :(得分:0)

Reservation.all.search不起作用,因为它将所有结果作为数组返回,而Reservation.where(..)返回ActiveRecord对象(AREL)。 Reservation.all实际上提取结果,而不是仅仅进一步构建查询,wherelimit等方法。