[英]Rails SQL query, passing array of ids to sql WHERE…IN clause
[英]Rails - How to query by multiple ids(array)
在 rails 4 中,我试图使用多个 id 访问 ActiveRecord 关系。
Id 以Parameters: {"ids"=>"[55, 56]"}
。 在控制器中,我将其用作User.where(:id=>params[:ids])
但此查询返回零结果。
查看路径就像user_posts_path(:ids=>[5, 6])
现在params[:ids].class.name
是String
。 如何使其仅作为数组?
试试
User.where(id: JSON.parse(params[:ids]))
但如果可能的话,我会尝试将这些 id 作为数组传递,而不是字符串中的数组。
Rails 有一个内置的符号来通过查询字符串传递数组。
Started GET "/users?ids[]=1&ids[]=2&ids[]=3" for ::1 at 2016-08-19 12:08:42 +0200
Processing by UsersController#index as HTML
Parameters: {"ids"=>["1", "2", "3"]}
当您使用some_key[]=1&some_key[]=2
表示法时,Rails 会将所有some_key
参数合并到一个数组中。
将数组传递给路径助手将生成正确的请求 URL。
irb(main):012:0> app.users_path(ids: [1,2,3])
=> "/users?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3"
# for clarity
irb(main):013:0> CGI.unescape app.users_path(ids: [1,2,3])
=> "/users?ids[]=1&ids[]=2&ids[]=3"
使用JSON.parse
只是通过黑客修复来掩盖应用程序中的错误。
在您的情况下,最有可能出错的是users_path(ids: some_variable)
的输入是字符串而不是预期的数组。
irb(main):014:0> CGI.unescape app.users_path(ids: "[1,2,3]")
=> "/users?ids=[1,2,3]" # this will not be treated as an array!
上面的答案值得注意:它们不维护秩序,也不检索重复项。 为了维持秩序,较新的 Rails 版本允许以下内容:
User.find(32, 12, 4,2,1,2,5).map(&:id)
=> [32, 12, 4, 2, 1, 5]
除了手动重新填充列表之外,我不知道有什么方法可以重新插入重复项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.