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

时间:2016-08-19 09:40:52

标签: mysql ruby-on-rails arrays ruby

在rails 4中,我试图使用多个ID来访问ActiveRecord关系。

Ids以Parameters: {"ids"=>"[55, 56]"}的形式出现。在控制器中,我将其用作User.where(:id=>params[:ids]),但此查询返回零结果。

查看路径类似于user_posts_path(:ids=>[5, 6])

现在params[:ids].class.nameString。如何使它只作为一个数组?

3 个答案:

答案 0 :(得分:2)

尝试

User.where(:id=> JSON.parse(params[:ids]))

但是如果可能的话,我会尝试将这些ID作为数组传递,而不是字符串中的数组。

答案 1 :(得分:2)

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只是通过hacky修复来掩盖应用程序中的错误。

在您的情况下最可能出现的问题是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!

答案 2 :(得分:0)

上面的答案值得注意的地方:它们不保持顺序,并且不检索重复项。为了保持秩序,较新的Rails版本允许以下操作:

User.find(32, 12, 4,2,1,2,5).map(&:id)
=> [32, 12, 4, 2, 1, 5]

除了手动重新填充列表之外,我不知道有什么方法可以将重复项重新插入。