对命名范围的验证

时间:2015-03-23 19:15:26

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

我正在努力寻找一种方法来验证命名范围的参数。

说明性设置:

模型/ 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,而不是增加列限制。

我研究过:

  • guides.rubyonrails.org/active_record_validations.html(适用 仅用于保存到数据库)
  • guides.rubyonrails.org/routing.html(细分限制)

有什么想法吗? 感谢

1 个答案:

答案 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