2016-08-19 72 views
1

在rails 4中,我试图使用多个ID访问一个ActiveRecord关系。Rails - 如何查询多个ID(数组)

ID是来为Parameters: {"ids"=>"[55, 56]"}。在控制器中,我使用它作为User.where(:id=>params[:ids]),但此查询返回零结果。

查看路径就像user_posts_path(:ids=>[5, 6])

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

回答

2

尝试

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

但我会尝试在一个字符串,通过这些ID作为数组,而不是一个数组如果可能的话。

+0

谢谢。它工作正常。我只将它作为一个数组传递,但它在参数内部作为一个字符串。 –

+0

不客气:) – Ursus

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只是掩盖错误与哈克解决您的应用程序。

什么是最有可能会错在你的情况是,输入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!