【问题标题】:Can I access the collection an instance method was called on in ruby on rails我可以访问在 ruby​​ on rails 中调用实例方法的集合吗
【发布时间】:2011-01-18 14:27:06
【问题描述】:

我正在努力在 ruby​​ on rails 应用程序中实现搜索表单。总体思路是使用 form_tag 将搜索字段(通过参数)提交给我要搜索的类模型中的搜索函数。然后搜索函数将遍历每个参数,如果函数的名称出现在参数中,则执行范围函数。

问题是当我像这样调用集合搜索时:

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

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

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

我这里有搜索方法的详细信息:https://gist.github.com/783964

任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby reflection activerecord


    【解决方案1】:

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

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

    [edit] 我看了你的搜索功能,我想你想要的是:

    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(或任何范围)。

    【讨论】:

    • 我没有尝试 Reservation,但自己返回了 Reservation Class。
    • @biagidp,是的,它当然会返回 Reservation 类,但尝试用它做一些事情(例如 self.count,它会给你与 @calendar.reservations.count 相同的输出;或self.all,它会给你数组)
    • @biagidp:我更新了答案,查看并重构了搜索方法。这应该可以工作,除非您使用的是非常旧的 Rails 版本(可能
    • tokland:感谢您如此彻底地回答我的问题并坚持不懈地帮助我今天学习一些东西!
    【解决方案2】:

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

    只需使用where:

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

    【讨论】:

    • 好吧,也许 search 正在做一些我们看不到的工作。有一个单独的方法来完成任务也不错(在那里你可以制作 where 和任何你需要的东西;也许可以转换值、保存搜索等)
    • 根据他的 Gist 似乎并非如此:gist.github.com/783964 但好点,无论如何。
    • 搜索功能用于迭代多个键、值对并将每个应用于尚未成文的范围方法。我追求的最终结果是基于表单输入的动态范围。
    • @biagidp,您可以通过注入应用多个范围。
    【解决方案3】:

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

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

    【讨论】:

    • 这一切都开始了,因为 searchlogic 不能与 rails 3 一起使用。MetaSearch 看起来是一个很棒的替代品。我一定会试一试的。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多