我有一堆对象准备好在我的控制器中进行查询。我将这些对象传递给要过滤的方法,因为在同一个控制器中的多个动作中应用了相同的过滤器。
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_object似乎并没有改变foos。而且,当我向some_action发出控制器请求时,它甚至不会出现在我的查询中。在我的过滤器方法中将raise objects.length.inspect
放在objects = objects.where
的任意一侧会显示objects
的长度保持不变。
我认为我对Ruby / Rails中对象或查询的工作方式有一些基本的误解。有人能引导我朝着正确的方向前进吗?
答案 0 :(得分:0)
我认为您不能更改传递给filter_objects的对象,并且会影响外部作用域中的foos。我自己也对此感到困惑。您可能想了解Ruby parameter handling。
相反,请执行:
foos = filter_objects(foos)
并将定义更改为:
def filter_objects(objects)
objects.where(:bar => "baz")
end