【问题标题】:ruby rails - getting a collection of objects from a collection of foreign keysruby rails - 从外键集合中获取对象集合
【发布时间】:2012-01-08 15:30:33
【问题描述】:

我认为/希望很简单...我有一个查询,它返回一个包含 20 个唯一外键的列表:

@results   = Report.select("distinct user_id").where("datetime_utc >= ? AND datetime_utc <= ?",@utc_time_slot , @utc_time_slot_end).order("score DESC, quality DESC").limit(20)  

这会返回一个数组(ActiveRecord::Relation 类):

[#<Report user_id: 803>, #<Report user_id: 809>, #<Report user_id: 806>, #<Report user_id: 801>, #<Report user_id: 830>, #<Report user_id: 860>, #<Report user_id: 858>, #<Report user_id: 856>, #<Report user_id: 854>, #<Report user_id: 852>, #<Report user_id: 851>, #<Report user_id: 850>, #<Report user_id: 849>, #<Report user_id: 846>, #<Report user_id: 859>, #<Report user_id: 866>, #<Report user_id: 2022>, #<Report user_id: 863>, #<Report user_id: 862>, #<Report user_id: 838>]

我需要用这个@results 数组做什么来从user_id 列表引用的用户表中提取用户集合(以相同的顺序)?

谢谢!

【问题讨论】:

    标签: sql ruby activerecord ruby-on-rails-3.1


    【解决方案1】:

    您有两种选择来保持秩序。首先 - 在原始查询中急切加载用户。在这种情况下

    users = @results.map(&:user)
    

    第二 - 在 ruby​​ 端重新排序

    idx = User.find(@results.map(&:user_id)).index_by(&:id)
    users = @result.map{|r| idx[r.use_id]}
    

    【讨论】:

    • 是的 - 这两种方法都有效 - 第二种解决方案似乎略快一些。谢谢
    • 如果你渴望正确加载第一个应该更快
    【解决方案2】:

    怎么样:

    users = @results.collect(&:user)
    

    【讨论】:

    • 如果原始查询没有预先加载,它将导致 N 个查询
    • users = @results.includes(:user).collect(&:user)
    【解决方案3】:

    嘿嘿, 首先,您需要准备 user_ids 数组。它应该看起来像这样 [209, 902, ..., 890](你可以使用 map 或 collect 方法来做到这一点)然后像这样构建 sql 查询:

    User.where(:id=>user_ids)
    

    user_ids 准备数组的位置

    【讨论】:

    • 这不会保留顺序。
    • 您好 - 问题在于原始数组的顺序丢失了(它根据用户 ID 重新排列结果...)
    • 你可以在你的查询中包含用户对象...m.onkey.org/active-record-query-interface
    • 使用包含 - 试试看
    【解决方案4】:

    User.find(@results.map(&amp;:user_id))

    【讨论】:

    • 你好。谢谢你:我快速尝试了一下,它返回一个错误 - 所以我转换了@results.to_a 然后它没有返回任何结果。
    • @user1051849 很奇怪。我很确定这应该可行。因为我经常使用这种技术。调查一下。
    • @user1051849 是的。应该管用。不知道为什么它不适合你。您第一次尝试时遇到了什么样的错误?
    • @user1051849 啊哈.. 由于我们在这里使用数组,我会假设排序会保持不变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2023-03-21
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    相关资源
    最近更新 更多