繁体   English   中英

Rails - 如何通过多个 id(数组)进行查询

[英]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.nameString 如何使其仅作为数组?

试试

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM