我正在努力寻找一种方法来验证命名范围的参数。
说明性设置:
模型/ products.rb
scope :country, -> country {where(:country_id => country)}
控制器/ product_controller.rb
has_scope :country, :type => :array
表架构:
create_table "products", force: :cascade do |t|
t.string "name", limit: 255
t.integer "country_id", limit: 4
end
示例A: 本地主机:3000 /产品COUNTRY_ID = 1
按预期返回有效产品
例B: 本地主机:3000 /产品COUNTRY_ID = 111111111111111111111
返回111111111111111111111超出ActiveRecord :: Type :: Integer的限制范围4
这是有道理的,因为我已将country_id列限制为4.但是,在运行指定范围' country'之前,我想要验证恶意country_id,而不是增加列限制。
我研究过:
有什么想法吗? 感谢
答案 0 :(得分:0)
您可以强制范围仅读取country_id
值的前4位数字:
scope :country, -> country { where(:country_id => country.to_s[0..3].to_i) }
但它看起来很难看......
在我的IRB中:
1.9.3p392 :003 > 355555454.to_s[0..3].to_i
=> 3555
1.9.3p392 :004 > 3.to_s[0..3].to_i
=> 3
或最终没有返回结果:
scope :country, -> country do
if country.to_s.length > 4
where(id: -1)
else
where(:country_id => country)
end
end