【问题标题】:Rails - How to query by multiple ids(array)Rails - 如何通过多个 id(数组)查询
【发布时间】:2016-12-26 10:10:54
【问题描述】:

在 rails 4 中,我尝试使用多个 id 访问 ActiveRecord 关系。

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

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

现在params[:ids].class.nameString。如何使其仅作为数组?

【问题讨论】:

    标签: mysql ruby-on-rails arrays ruby


    【解决方案1】:

    试试

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

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

    【讨论】:

    • 谢谢。它工作正常。我只将它作为一个数组传递,但它在参数中作为一个字符串。
    【解决方案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!
    

    【讨论】:

      【解决方案3】:

      上面的答案值得注意的一点是:它们不维护顺序,也不检索重复项。为了维持秩序,较新的 Rails 版本允许:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        相关资源
        最近更新 更多