我正在使用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
非常感谢任何帮助!
答案 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实际上提取结果,而不是仅仅进一步构建查询,where
,limit
等方法。