ruby Rails:是否可以检查指定的作用域对于给定的活动记录是否有效?

ua4mk5z4  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(80)

我正在使用Ruby 1.8.7-p374和Rails 2.3.18。(是的,我知道,我们正在努力。
我正在考虑动态地传递一个命名的作用域,用作ActiveRecord的条件。是否可以检查传递的字符串是否是记录的有效命名范围?
例如:
如果我为Car定义了一个名为:red的命名范围

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

字符串
那有没有什么功能

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


提前感谢。

rkkpypqq

rkkpypqq1#

您可以使用.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)


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

/cars?filter=destroy_all


Car模型响应.destroy_all方法,所以Ruby在Car模型上调用它。“轰”的一声,所有的汽车都被摧毁了!

bbmckpt7

bbmckpt72#

scopes将返回该类的所有作用域的散列。你可以看到它是否在那里-名字被存储为符号。例如

if Car.scopes[:red]
  ...

字符串
这将返回作用域本身(truthy)或nil(falsy),这对于通过/失败if测试很好。如果你真的想要回true或false,那么你可以做到!!将其转换为布尔值。

a_bool = !!Car.scopes[:red]

rslzwgfq

rslzwgfq3#

检查您的示波器是否出现在此列表中以进行验证。MyKlass.send(:generated_relation_methods).instance_methods

相关问题