将ActiveRecord ID查询限制为仅使用实数整数

时间:2016-07-04 20:29:58

标签: ruby-on-rails activerecord

现在我发现ActiveRecord的查询太灵活了。即:

MaintenanceOrder.where(id:" 1   ")
=> [#<MaintenanceOrder id: 1...] 
MaintenanceOrder.where(id:"1.2")
=> [#<MaintenanceOrder id: 1...] 
MaintenanceOrder.where(id:"1/2")
=> [#<MaintenanceOrder id: 1...] 
MaintenanceOrder.where(id:"x")
=> []
MaintenanceOrder.where(id:"? ")
=> [] 

如果传递给id的内容是由除整数和空格以外的任何内容组成的字符串(删除了任何前导0),我希望只找到b的记录。显然我可以使用正则表达式在查询之前解决这个问题,但我想知道是否有一些Rails方法可以自动执行此操作。这样,我就能做到这样的事情:

object = MaintenanceOrder.where(id: some_id)
if object.exists?
  ...

而不是做这样的事情

if some_id is invalid
  ...
else MaintenanceOrder.where(id:some_id)

2 个答案:

答案 0 :(得分:0)

而不是在哪里可以使用find方法。来自文档:&#34;如果主键是整数,则按id查找使用to_i&#34;

强制其参数
Person.find(1)          # returns the object for ID = 1
Person.find("1")        # returns the object for ID = 1
Person.find("31-sarah") # returns the object for ID = 31

http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find

答案 1 :(得分:0)

这应该有效:

[1] pry(main)> User.where('id like ?', "   22878 ")
  User Load (65.4ms)  SELECT `users`.* FROM `users` WHERE (id like '   22878 ')
=> []

VS.

[2] pry(main)> User.where('id like ?', 22878)
  User Load (69.9ms)  SELECT `users`.* FROM `users` WHERE (id like 22878)
=> [#<User:0x0000000ad69070
  id: 22878,
  ....

您必须检查any?而不是present?或在first结果上应用where