Rails:是否可以检查命名范围是否对给定的活动记录有效?

时间:2014-05-20 13:51:46

标签: ruby-on-rails ruby scope rails-activerecord

我使用Ruby 1.8.7-p374和Rails 2.3.18。 (是的,我知道,我们正在研究它。)

我考虑动态传递一个命名范围,以用作ActiveRecord的条件。是否可以检查传递的字符串是否是记录的有效命名范围?

例如:

如果我有一个名为的范围:为汽车定义的红色

named_scope :red, :condition => ["color = ?", "red"]

然后是否有我可以做的功能

Car.some_function("red")   # returns true
Car.some_function("blue")  # returns false

先谢谢。

2 个答案:

答案 0 :(得分:5)

您可以使用.respond_to?(:method)documentation here

在你的情况下:

Car.respond_to?(:red)  # => true
Car.respond_to?(:blue) # => false

但是你说:

  

我正在考虑动态传递一个命名范围,以用作ActiveRecord的条件

我希望你不要使用这样的东西:

# url
/cars?filter=red

# controller
def index
 @cars = Car.send(params[:filter]) if params[:filter].present? && Car.respond_to?(params[:filter])
 @cars ||= Car.find(:all)

猜猜如果我使用此网址会发生什么?

/cars?filter=destroy_all

Car模型响应方法.destroy_all,因此Ruby在Car模型上调用它。 BOOM ,所有汽车都被摧毁了!

答案 1 :(得分:3)

Klass.scopes将返回该类的所有范围的哈希值。你可以看到它是否存在 - 名称存储为符号。例如

if Car.scopes[:red]
  ...

这将返回范围本身(truthy)或nil(falsy),这对于通过/失败if测试是合适的。如果你真的想要真或假,那么你可以做!!在它上面将它转换为布尔值。

a_bool = !!Car.scopes[:red]