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

war*_*r57 1 ruby scope ruby-on-rails rails-activerecord

我正在使用Ruby 1.8.7-p374和Rails 2.3.18.(是的,我知道,我们正在努力.)

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

例如:

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

named_scope :red, :condition => ["color = ?", "red"]
Run Code Online (Sandbox Code Playgroud)

然后是我可以做的一些功能

Car.some_function("red")   # returns true
Car.some_function("blue")  # returns false
Run Code Online (Sandbox Code Playgroud)

提前致谢.

MrY*_*iji 6

你可以使用.respond_to?(:method)(这里的文档)

在你的情况下:

Car.respond_to?(:red)  # => true
Car.respond_to?(:blue) # => false
Run Code Online (Sandbox Code Playgroud)

你说:

我正在考虑动态传递一个命名范围作为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)
Run Code Online (Sandbox Code Playgroud)

猜猜如果我使用这个URL会发生什么?

/cars?filter=destroy_all
Run Code Online (Sandbox Code Playgroud)

Car模型响应方法.destroy_all,使红宝石调用它的汽车模型.BOOM,所有汽车都被毁坏了!