【问题标题】:Rails controller: Applying filter to ActiveRecord collectionRails 控制器:将过滤器应用于 ActiveRecord 集合
【发布时间】:2014-08-28 01:32:51
【问题描述】:

我已经为控制器中的查询准备了一堆对象。我将这些对象传递给要过滤的方法,因为在同一个控制器的多个操作中应用了相同的过滤器。

def some_action
    foos = Foo.where(nil)
    filter_foos(foos)

    stuff
end

def some_other_action
    foos = Foo.where(nil)
    filter_foos(foos)

    other_stuff
end

def filter_objects(objects)
    objects = objects.where(:bar => "baz")
end

然而,调用 filter_objects 似乎并没有改变 foos.此外,当我向 some_action 发起控制器请求时,它甚至不会出现在我的查询中。在我的过滤方法中将raise objects.length.inspect 放在objects = objects.where 的任一侧表明objects 的长度保持不变。

我认为我对对象或查询在 Ruby/Rails 中的工作方式存在某种根本性的误解。有人可以引导我朝着正确的方向前进吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    我认为您不能更改传递给 filter_objects 的对象并影响外部范围内的 foos。我自己对此感到困惑。您可能想了解Ruby parameter handling

    改为:

    foos = filter_objects(foos)
    

    并将定义更改为:

    def filter_objects(objects)
        objects.where(:bar => "baz")
    end
    

    【讨论】:

    • 这是下一个选项,将对象设置为等于方法的返回值。它也有效;这就是我因为懒惰而得到的:)
    猜你喜欢
    • 2010-11-26
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多